core.async:超时后终止go循环

时间:2017-04-27 22:21:11

标签: clojure core.async

我有一个函数处理来自共享通道的值流,并查找满足特定谓词的值:

(defn find-my-object [my-channel]
  (go-loop []
    (when-some [value (<! my-channel)]
      (if (some-predicate? value)
        value
        (recur)

现在我想让这个功能返回一些“失败”。等待超时后的值,我已经这样实现了:

(alts! [(find-my-object my-channel) (timeout 1000)])

这个问题是上面的循环在超时后继续执行。我希望find-my-object在搜索正在进行时耗尽my-channel 的值,但我不想在超时时关闭my-channel,因为它&# 39;用于其他一些地方。实现此功能的惯用方法是什么?

1 个答案:

答案 0 :(得分:2)

find-my-object内部的超时频道读取,而不是在其外部。如果你愿意,可以硬编码,或者让函数采用第二个通道参数,即“请停止阅读”通道。然后你可以传递一个超时通道来获得你现在想要的行为,或者传递一些其他类型的通道来以不同的方式控制它。