Clojure 如何避免在使用core.async pub/sub时删除项目?

Clojure 如何避免在使用core.async pub/sub时删除项目?,clojure,channels,core.async,Clojure,Channels,Core.async,我有一个作为出版商的频道: (def publisher (async/chan)) (def publication (async/pub publisher :topic)) (async/put! c1 {:topic :foo :msg "after"}) ==> got val {:topic :foo :msg "after"} 由于sub/pub的性质,当我这样做时: (async/put! publisher {:topic :foo}) 该消息被发布使用,由于没有订

我有一个作为出版商的频道:

(def publisher (async/chan))
(def publication (async/pub publisher :topic))
(async/put! c1 {:topic :foo :msg "after"})
==> got val {:topic :foo :msg "after"}
由于
sub/pub
的性质,当我这样做时:

(async/put! publisher {:topic :foo})
该消息被发布使用,由于没有订阅者,因此将被删除

如果我尝试订阅
:foo
主题:

(def reader (async/chan))
(async/sub publication :foo reader)
(async/go (println "got val " (async/<! reader)))
有没有办法不丢失,比如说,出版商制作的最后一个
n
项目,即使订阅者尚未订阅

当没有匹配的SUB时接收的项目将被丢弃

接受给定主题的
buf fn
函数。此函数应返回一个缓冲区。例如
放置缓冲区
滑动缓冲区
。因此,如果希望缓冲
:foo
主题:

(pub pub-ch :topic #(if (= % :foo) (sliding-buffer 10) nil))

另请参见。

是的,我知道。。。我只是想知道是否有办法解决这个问题。您可以在
sub
中传递buf fn,但它似乎只有在调用
sub
时才使用。所以看起来它不适合您的用例。