Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Core.async:通过异步函数映射通道_Asynchronous_Clojure_Core.async - Fatal编程技术网

Asynchronous 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

使用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))))))
(定义我的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)