2016-01-16 3 views

ответ

4

core.async предлагает пару функций для этого:

  • offer! поставить что-то на канал, если доступно пространство, и сообщите, если он заполнен.
  • poll! получает что-то, если оно доступно, и позволяет узнать, нет ли на данный момент канала.

Таким образом, вы могли бы написать что-то вроде:

(if-not (offer! my-chan 42) 
    (close! my-chan)) 

который бы выполнить это, когда вы кладете что-то на канале. Скорее всего, это безопаснее, чем попытка увидеть другой процесс на тот момент, когда он будет заполнен, а затем закроет его. Если вы действительно хотите просто проверить, если она полна вы можете извлечь буфер и спросить его:

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

, хотя думаю, что один через тщательно первым.

+0

К сожалению, моя программа заслуживает второго подхода (но полезно узнать о предложении! И опросе!). Проблема в том, что поставляемый фрагмент кода не работает в ClojureScript. У каналов есть метод .buf в контексте CLJS? – George

+0

Nevermind: получается, что использование '(count (.-Buf (chan)))' делает трюк в ClojureScript. – George

Смежные вопросы