Core.async:通过异步函数映射通道

时间:2017-03-05 19:51:11

标签: 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 10)))
(def my-chan2 (chan (buffer 10)))

(go (while true
      (>! my-chan2
          (<! (async-inc (<! my-chan))))))

它实际上不是映射,因为需要两个通道而不是一个。

1 个答案:

答案 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)