我有一个非常简单的用例:在文本区域中,我想停止某些键代码的事件传播并触发某些函数f
,对于其他键代码,我只是触发一些函数g
。
所以我已经定义了一个名为out
的频道和一个监听器,它将所有keypress
个事件放入频道:
(events/listen
(dom/getElement "input")
"keypress"
(fn [e] (put! out e)))
这就是关键所在:我应该在哪里停止事件传播?要做到这一点在之后我从频道中提取事件似乎逻辑上迟到了,并且正如预期的那样,它不起作用。如上所示,在处理程序内停止事件传播似乎是惯用的错误。我真的不想把任何逻辑放到预通道处理程序中:为什么我会使用core.async,如果我直接在监听器中完成所有工作?
那么它应该如何运作呢?
答案 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