欢迎!有关本网站如何工作的更多信息,请参阅关于页面。
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 规范中。这通常会导致库使用简化,消费命名空间不必担心显式区分某些变量是函数还是宏。例如