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

Events 使用core.async(ClojureScript)停止事件传播的惯用方法是什么?,events,clojurescript,core.async,Events,Clojurescript,Core.async,我有一个非常简单的用例:在文本区域中,我想停止一些关键代码的事件传播并触发一些函数f,而对于其他关键代码,我只触发一些函数g 所以我定义了一个调出的频道和一个侦听器,它将所有按键事件放入该频道: (events/listen (dom/getElement "input") "keypress" (fn [e] (put! out e))) (def ch (async/filter> even? (async/chan))) (go-loop [msg (asy

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

所以我定义了一个调出的频道和一个侦听器,它将所有按键事件放入该频道:

(events/listen
    (dom/getElement "input")
    "keypress"
    (fn [e] (put! out e)))
(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
关键是:我应该在哪里阻止事件传播?在我从通道中提取事件之后执行此操作,在逻辑上似乎太晚了,而且正如预期的那样,无法正常工作。如上图所示,在处理程序中停止事件传播在习惯上似乎是错误的。我真的不想在通道前处理程序中加入任何逻辑:如果我直接在侦听器中完成所有工作,那么为什么要使用core.async呢


那么它应该如何工作呢?

我认为@edbond上面的回答是正确的,如果您有clojure、clojurescript和core.async的最新版本,足以支持传感器,那么您应该使用它

如果您在较旧的堆栈上,则可以使用filter>fn在通道上应用过滤:

(events/listen
    (dom/getElement "input")
    "keypress"
    (fn [e] (put! out e)))
(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

请看core.async网络研讨会示例-。有一个例子,你可以调整滤波器传感器。