使用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 10)))
(def my-chan2 (chan (buffer 10)))
(go (while true
(>! my-chan2
(<! (async-inc (<! my-chan))))))
它实际上不是映射,因为需要两个通道而不是一个。
答案 0 :(得分:1)
一般建议不要在函数内部创建通道并将其返回,因为它会强制该函数的用户使用core.async。您可以通过promise返回输出,也可以通过回调函数返回。
假设您要对async-inc
的输出执行的操作是使用println
函数将其打印出来。
通过承诺返回
(defn async-inc [n]
(let [p (promise)]
(deliver p (inc n))
p))
(println @(async-inc (<! my-chan)))
通过回调返回
(defn async-inc [n callback]
(callback (inc n)))
(async-inc (<! my-chan) println)
但如果您无法控制async-inc
。这是你的选择。
使用<!!
(println (<!! (go (<! (async-inc (<! my-chan))))))
或
使用take!
(take! (go (<! (async-inc (<! my-chan)))) println)