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