欢迎!请查看关于页面以了解更多有关如何操作的信息。
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 规范中。这通常导致简化库的使用,使得消耗命名空间无需担心明确区分某些变量是函数还是宏。例如