欢迎!请参阅 关于 页面以了解有关此机制的更多信息。
https://script.clojure.org/guides/promise-interop
这是设置 core.async 的方式
(:require [cljs.core.async :refer [go]] [cljs.core.async.interop :refer-macros [<p!]])
我们正在使用当前的 shadow-cljs 和 Node 目标,我们发现这个配方将 'go' 作为函数而不是宏公开。
将:refer-macros [go] 替换为可修复问题
你能解释一下你在遇到什么问题吗?'作为函数公开'是什么意思?
/t/async ❯❯❯ clj -A:cljs:async -m cljs.main -re node -r ClojureScript 1.10.773 cljs.user=> (require '[clojure.core.async :as a :refer [go]]) nil cljs.user=> (doc go) ------------------------- cljs.core.async/go ([& body]) Macro Asynchronously executes the body, returning immediately to the calling thread. Additionally, any visible calls to <!, >! and alt!/alts! channel operations within the body will block (if necessary) by 'parking' the calling thread rather than tying up an OS thread (or the only JS thread when in ClojureScript). Upon completion of the operation, the body will be resumed. Returns a channel which will receive the result of the body when completed nil cljs.user=>(let [x (go 3)] (go (prn (a/<! x)))) #object[cljs.core.async.impl.channels.ManyToManyChannel] cljs.user=> 3
此外,这应该是没有问题的。
上面的相关部分隐式宏加载:如果一个命名空间需要或使用,并且该命名空间本身需要或使用自己的命名空间中的宏,那么将使用相同的规范隐式地需要或使用这些宏。此外,在这种情况下,宏变量可以包含在 :refer 或 :only 规范中。这往往导致简化库的使用,使得消费命名空间不必担心明确区分某些变量是函数还是宏。例如