【问题标题】:What is the idiomatic way to stop the event propagation with core.async (ClojureScript)?使用 core.async (ClojureScript) 停止事件传播的惯用方法是什么?
【发布时间】:2014-11-19 19:24:38
【问题描述】:

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

所以我定义了一个名为out 的通道和一个监听器,它将所有keypress 事件放到通道中:

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

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

那么它应该如何工作呢?

【问题讨论】:

标签: events clojurescript core.async


【解决方案1】:

我认为@edbond 上面的回答是正确的,如果你有足够最新的 clojure、clojurescript 和 core.async 版本来支持传感器,你应该这样做。

如果您在较旧的堆栈上,可以使用 filter> 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

【讨论】:

    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2012-10-10
    相关资源
    最近更新 更多