2014-02-18 4 views
24

모두가 위대한 core.async가 얼마나 큰지에 대해 이야기하고 있으며, 이것이 클로저 스크립트에서 이벤트 처리를 개선하는 방법에 대해 설명합니다. 나는 ClojureScript 101 튜토리얼을 따라 왔으며,이 코드 예제를 통해 명확한 이점을 얻지 못했다. 내가 뭘 놓치고 있니?clojurescript에서 core.async의 이점은 무엇입니까?

여기서 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))))) 

(defn dosomethingcallback 
    [e] 
    (js/console.log "callback: " e)) 

(events/listen (dom/getElement "search2") "click" dosomethingcallback) 
+1

다른 좋은 자원을! http://www.infoq.com/interviews/baldridge-core-async – tangrammer

답변

34

위대한 질문! 나는 우리가 조금 당신의 코드를 변경하면 차이가 정리 것이라고 생각

:

나는 이점을 이해하는 첫 번째 단계는 Timothy Baldridge Video

그리고 내 시도 아래에있을 것입니다 생각합니다. clojure blog에 게시 core.async의 프리젠 테이션에서 추출

첫째, 문장 을 강조하려고 "구성 요소 또는 서브 시스템이 서로 직접 통신 중지해야 할 때 모든 좋은 프로그램의 시간이 온다." ,

(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") 

둘째 core.async으로 우리는 우리가 동기 호출 (일련 번호)를 쓸 것이다 비동기 호출을 작성할 수 있습니다 : 나는 우리가하자의 FN에서 입력 이벤트 채널을 분리 할 수 ​​있다고 생각합니다. 이 상황의 예로는 하나 이상의 채널이 필요합니다.

(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!") 
     ) 
    ) 
    )) 

마지막으로 콜백 기능의 의미를 제대로 사용하지 않는 것 같습니다. 우리가 콜백 함수에 대해 말할 때, 우리는 자신의 매개 변수 외에도 함수 "콜백"을받는 함수를 언급한다고 생각합니다. 함수의 실행이 끝나면 콜백 함수를 호출하여 실행 흐름을 원래 지점으로 되돌립니다.

(defn dosomethingcallback 
    [e call-back-fn] 
    (js/console.log "callback: " e) 
    (call-back-fn)) 

을 우리가 앞의 코드 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)) 
관련 문제