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

core.async: terminate go loop after timeout

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

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

现在我希望这个函数在等待超时后 return 一些 'failure' 值,我是这样实现的:

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

这里的问题是上面的go-loop在超时后继续执行。我希望 find-my-objectmy-channel 中提取值,而 搜索正在进行,但我不想在超时时关闭 my-channel,因为它是在其他一些地方使用。实现此功能的惯用方法是什么?

find-my-object 内部的超时通道读取,而不是外部。如果愿意,您可以对其进行硬编码,或者使函数采用第二个通道参数,即 "please stop reading things" 通道。然后你可以给它传递一个超时通道来获得你现在想要的行为,或者传递给它一些其他类型的通道以不同的方式控制它。