我试图在我的 REPL 中找出 core.async 并且对于我对 (go-loop ...) 的使用如何不符合 async/> 目的的“go 块”,我完全感到困惑!

我的循环就像...

(async/go-loop [page (range 3)]
  (if (empty? page)
    (async/close! ch)
    (dorun (map (fn [row]
                  (println row)
                  (async/>! ch row)) page)))
  (recur (range (dec (count page)))))

但是 REPL 很不高兴...
=>
#object[clojure.core.async.impl.channels.ManyToManyChannel
        0x23465937
        "clojure.core.async.impl.channels.ManyToManyChannel@23465937"]
0
Exception in thread "async-dispatch-12" java.lang.AssertionError: Assert failed: >! used not in (go ...) block
nil
...

为什么 (go-loop ...) 的范围不足以满足 (async/>! row) 调用?

我什至应该在这里使用 go-loop 吗?

最佳答案

不幸的是,>! 和其他停放调用不能在嵌套在 go 内部的函数内使用。go 将您提供的代码转换为状态机并查找 parking 调用。然而,它不会查看嵌套函数的内部。
来自 Clojure.Asyncs Github best practice page :

关于clojure - 为什么 "Assert failed: >! used not in (go ...) block",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45971689/

10-10 18:55
查看更多