绑定功能如何与core.async一起使用?

时间:2015-07-22 23:43:53

标签: clojure clojurescript

使用与core.async的绑定是否可以?我使用的是ClojureScript,因此core.async非常不同。

(def ^:dynamic token "no-token")
(defn call 
  [path body] 
  (http-post (str host path) (merge {:headers {"X-token" token}} body)))) ; returns a core.async channel
(defn user-settings
  [req]
  (call "/api/user/settings" req))
; elsewhere after I've logged in
(let [token (async/<! (api/login {:user "me" :pass "pass"}))]
  (binding 
    [token token] 
    (user-settings {:all-settings true})))

1 个答案:

答案 0 :(得分:2)

在ClojureScript 1 中,binding基本上是with-redefs,另外还要检查所涉及的Vars是否标记为:dynamic。另一方面,go被安排在块中执行 1 (也就是说,它们可能被“停放”并且稍后恢复,并且go块之间的交错是任意的)。这些模型根本不能很好地融合。

简而言之,不,请改为使用显式传递的参数。

1 Clojure中的细节有所不同,但结论仍然相同。

2 使用尽可能快的机制setTimeout,如果没有更好的可用时间,则为0。