我有一个函数处理来自共享通道的值流,并查找满足特定谓词的值:
(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;用于其他一些地方。实现此功能的惯用方法是什么?
答案 0 :(得分:2)
从find-my-object
内部的超时频道读取,而不是在其外部。如果你愿意,可以硬编码,或者让函数采用第二个通道参数,即“请停止阅读”通道。然后你可以传递一个超时通道来获得你现在想要的行为,或者传递一些其他类型的通道来以不同的方式控制它。