Imo*_*gen 26 clojurescript core.async
每个人都在谈论core.async有多棒,以及如何改进clojurescript中的事件处理.我一直在关注ClojureScript 101教程,我没有从这些代码示例中看到任何明显的优势.我错过了什么?
为什么在这里使用core.async更好?
(defn listen [el type]
(let [out (chan)]
(events/listen el type
(fn [e] (put! out e)))
out))
(defn dosomethingasync
[e]
(js/console.log "async: " e))
(let [clicks (listen (dom/getElement "search1") "click")]
(go (while true (dosomethingasync (<! clicks)))))
Run Code Online (Sandbox Code Playgroud)
与
(defn dosomethingcallback
[e]
(js/console.log "callback: " e))
(events/listen (dom/getElement "search2") "click" dosomethingcallback)
Run Code Online (Sandbox Code Playgroud)
tan*_*mer 34
好问题!
我认为你了解其优势的第一步将是Timothy Baldridge Video
在我的尝试之下:
我认为如果我们改变你的代码,差异就会消失.
首先,尝试突出显示句子"在组件或子系统必须停止直接相互通信的所有优秀程序中的时间"从clojure博客上发布的core.async的表示中提取.我认为我们可以将输入事件通道与let fn分开:
(def clicks (listen (dom/getElement "search1") "click"))
(go
(while true
(dosomethingasync (<! clicks))))
(put! clicks "this channel can be written from differents parts of your code")
Run Code Online (Sandbox Code Playgroud)
其次,使用core.async,我们可以编写异步调用,因为我们将编写同步调用(顺序代码).这种情况的一个示例需要多个通道:
(def clicks (listen (dom/getElement "search1") "click"))
(def keys-pressed (listen (dom/getElement "search1") "keypress"))
(def to-out (chan))
(go
(while true
(let [click-recieved (<! clicks)]
(dosomethingasync click-recieved)
(>! to-out "click recieved!")
(let [other-input-waited (<! keys-pressed)]
(dosomethingwithkey other-input-waited)
(>! to-out "keypressed recieved!")
)
)
))
Run Code Online (Sandbox Code Playgroud)
最后,我认为你没有正确使用回调函数的含义.当我们谈论回调函数时,我认为我们指的是一个函数,除了它自己的参数外,它还接收一个函数"callback".在函数执行结束时,我们调用回调函数将执行流程返回到原始点.更改"回调"功能如下:
(defn dosomethingcallback
[e call-back-fn]
(js/console.log "callback: " e)
(call-back-fn))
Run Code Online (Sandbox Code Playgroud)
如果我们尝试发布类似于以前的代码core.async示例所实现的相同行为:
(defn do-key
[call-back-fn e]
(.log js/console "before callback key" )
(call-back-fn e))
(defn do-click
[call-back-fn e]
(.log js/console "before callback click")
(call-back-fn e))
(defn key-callback-fn [e]
(.log js/console (str "doing some work with this key: " e))
)
(defn click-callback-fn [e]
(.log js/console (str "doing some work with this click" e))
(events/listen (dom/getElement "search2") "keypress" (partial do-key key-callback-fn)))
(events/listen (dom/getElement "search2") "click" (partial do-click click-callback-fn))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6321 次 |
| 最近记录: |