Asynchronous Core.async:通过异步函数映射通道
使用Clojure的Core.Async,可以使用传感器在通道上进行映射:Asynchronous Core.async:通过异步函数映射通道,asynchronous,clojure,core.async,Asynchronous,Clojure,Core.async,使用Clojure的Core.Async,可以使用传感器在通道上进行映射: (def my-chan (chan (buffer 10) (map inc))) 但是如果映射器函数本身是异步的,会发生什么呢 比如说,我们有一个: (defn async-inc [n] (let [c (promise-chan)] (put! (inc n)) c)) 是否有类似的简明方法来映射此函数上的通道?或者人们会做这样的事情: (def my-chan (chan (buffer
(def my-chan (chan (buffer 10) (map inc)))
但是如果映射器函数本身是异步的,会发生什么呢
比如说,我们有一个:
(defn async-inc [n]
(let [c (promise-chan)]
(put! (inc n))
c))
是否有类似的简明方法来映射此函数上的通道?或者人们会做这样的事情:
(def my-chan (chan (buffer 10)))
(def my-chan2 (chan (buffer 10)))
(go (while true
(>! my-chan2
(<! (async-inc (<! my-chan))))))
(定义我的chan(chan(缓冲区10)))
(def my-chan2(chan(缓冲器10)))
(虽然是真的
(>!my-chan2
(
它不是真正的映射,因为需要两个通道而不是一个通道。一般建议不要在函数内部创建通道并将其返回,因为它会强制该函数的用户使用core.async。您可以通过回调函数返回输出,也可以通过回调函数返回
假设您想要对来自async inc
的输出执行的操作是使用println
函数将其打印出来
通过承诺回报
(defn async-inc [n]
(let [p (promise)]
(deliver p (inc n))
p))
(println @(async-inc (<! my-chan)))
或
使用take!
(println (<!! (go (<! (async-inc (<! my-chan))))))
(take! (go (<! (async-inc (<! my-chan)))) println)
(走!(走(
(take! (go (<! (async-inc (<! my-chan)))) println)