使用core.async(ClojureScript)停止事件传播的惯用方法是什么?

时间:2014-09-25 05:51:06

标签: events clojurescript core.async

我有一个非常简单的用例:在文本区域中,我想停止某些键代码的事件传播并触发某些函数f,对于其他键代码,我只是触发一些函数g

所以我已经定义了一个名为out的频道和一个监听器,它将所有keypress个事件放入频道:

(events/listen
    (dom/getElement "input")
    "keypress"
    (fn [e] (put! out e)))

这就是关键所在:我应该在哪里停止事件传播?要做到这一点之后我从频道中提取事件似乎逻辑上迟到了,并且正如预期的那样,它不起作用。如上所示,在处理程序内停止事件传播似乎是惯用的错误。我真的不想把任何逻辑放到预通道处理程序中:为什么我会使用core.async,如果我直接在监听器中完成所有工作?

那么它应该如何运作呢?

1 个答案:

答案 0 :(得分: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