2014-09-25 25 views
0

我有一個非常簡單的用例:在文本區域,我想停止事件傳播一些鍵碼和觸發某些功能f,對於其他鍵碼,我只是觸發一些功能g使用core.async(ClojureScript)停止事件傳播的慣用方法是什麼?

所以我定義了一個名爲out通道和監聽器,它把所有keypress事件頻道:

這裏來的癥結:我應該在哪裏停止事件傳播?要做到這一點我從頻道提取事件似乎邏輯到晚,並如預期,不起作用。如上所示停止處理程序中的事件傳播似乎是習慣性錯誤的。我真的不想把任何邏輯放入預通道處理程序中:如果我直接在偵聽器中完成所有工作,爲什麼還要使用core.async?

那麼它應該如何工作呢?

+0

看看core.async研討會例子 - https://github.com/ cognitect /異步-網絡研討會/斑點/主/ SRC /網絡研討會/ core.cljs。您可以使用'filter'傳感器進行調整。 – edbond 2014-09-25 19:17:17

回答

0

我認爲@ edbond上面的答案是正確的,如果您有最新版本的clojure,clojurescript和core.async以支持傳感器,那麼您應該遵循這一點。

如果你是一個老棧上,你可以使用過濾器> FN申請通道上過濾:

(def ch (async/filter> even? (async/chan))) 
(go-loop [msg (async/<! ch)] 
    (when msg 
    (println msg) 
    (recur (async/<! ch)))) 

(go 
    (async/put! ch 1) ;; does nothing 
    (async/put! ch 2)) ;; prints 2