检查Clojure(脚本)通道是否已满

检查Clojure(脚本)通道是否已满,clojure,clojurescript,Clojure,Clojurescript,假设c是一个大小为n的通道。我试图用clojure(脚本)编写一个函数,检查c是否已满,如果已满,则关闭通道 但是如何检查频道是否已满?core.async为此提供了一对函数: !!如果有空间,在频道上放置一些内容,并让您知道频道是否已满 !!如果该频道可用,则获取内容,并让您知道该频道目前是否没有提供内容 所以你可以写一些像: (if-not (offer! my-chan 42) (close! my-chan)) 当你在频道上放东西的时候,它会完成这个任务。这可能比试图让另一个

假设
c
是一个大小为
n
的通道。我试图用clojure(脚本)编写一个函数,检查
c
是否已满,如果已满,则关闭通道


但是如何检查频道是否已满?core.async为此提供了一对函数:

  • !!如果有空间,在频道上放置一些内容,并让您知道频道是否已满
  • !!如果该频道可用,则获取内容,并让您知道该频道目前是否没有提供内容
所以你可以写一些像:

(if-not (offer! my-chan 42)
   (close! my-chan))
当你在频道上放东西的时候,它会完成这个任务。这可能比试图让另一个进程监视它满了的那一刻然后关闭它更安全。如果您确实想检查缓冲区是否已满,可以提取缓冲区并询问:

user> (->> (async/chan (async/buffer 1))
           (.buf)
           (.full?))
false

虽然先仔细想一想

不幸的是,我的程序值得采用第二种方法(但了解offer!和poll!是有用的)。现在的问题是,提供的代码片段在ClojureScript中似乎不起作用。频道在CLJS上下文中是否有
.buf
方法?无需担心:事实证明,在ClojureScript中使用
(count(.-buf(chan))
可以实现这个技巧。