Events 使用core.async(ClojureScript)停止事件传播的惯用方法是什么?
我有一个非常简单的用例:在文本区域中,我想停止一些关键代码的事件传播并触发一些函数f,而对于其他关键代码,我只触发一些函数g 所以我定义了一个调出的频道和一个侦听器,它将所有按键事件放入该频道: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
(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网络研讨会示例-。有一个例子,你可以调整滤波器传感器。