Clojure 相当于一个jQuery Deferred?
Clojure's equlivalent to a jQuery Deferred?
Clojure 有 promise
、future
、delay
等,但是 none 在语义上类似于 jQuery 中的 Deferred 对象。如果在值可用之前取消引用,它们通常会阻塞。延迟对象利用回调。 Clojure(不是 ClojureScript)本身提供什么类似于 jQuery Deferred?
您可以使用其他 Clojure 构造来获得您要查找的内容,但我认为核心 Clojure 中没有任何类似的内容。
作为一个简单的示例,它使用 future
但将计算值提供给提供的回调函数:
(defn deferred [func cb]
(future (let [v (func)]
(cb v))))
;; (deferred #(do (Thread/sleep 1000) 7) #(println %))
您可以添加特殊的异常处理,并使用 future-done?
检查一个值是否已准备好而不阻塞,等等。 (面向回调的异步行为方法在某些情况下非常出色,但如果您没有对 Clojure 提供的其他方法进行过多试验,您可能会发现它们也非常适合。)
您要找的似乎是 core.async
。
这就是我在 ClojureScript 中使用它的方式(Clojure 也是如此):
(defn get-db-data [href processf]
(let [ret (chan)
handler (comp #(put! ret %) processf)]
(GET (str db-host href)
{:with-credentials true
:response-format (ajax/json-response-format {:keywords? true})
:handler handler})
ret))
此功能立即 returns 通道 ,(据我了解)看起来非常适合作为 JS Promises 对应物。
Clojure 有 promise
、future
、delay
等,但是 none 在语义上类似于 jQuery 中的 Deferred 对象。如果在值可用之前取消引用,它们通常会阻塞。延迟对象利用回调。 Clojure(不是 ClojureScript)本身提供什么类似于 jQuery Deferred?
您可以使用其他 Clojure 构造来获得您要查找的内容,但我认为核心 Clojure 中没有任何类似的内容。
作为一个简单的示例,它使用 future
但将计算值提供给提供的回调函数:
(defn deferred [func cb]
(future (let [v (func)]
(cb v))))
;; (deferred #(do (Thread/sleep 1000) 7) #(println %))
您可以添加特殊的异常处理,并使用 future-done?
检查一个值是否已准备好而不阻塞,等等。 (面向回调的异步行为方法在某些情况下非常出色,但如果您没有对 Clojure 提供的其他方法进行过多试验,您可能会发现它们也非常适合。)
您要找的似乎是 core.async
。
这就是我在 ClojureScript 中使用它的方式(Clojure 也是如此):
(defn get-db-data [href processf]
(let [ret (chan)
handler (comp #(put! ret %) processf)]
(GET (str db-host href)
{:with-credentials true
:response-format (ajax/json-response-format {:keywords? true})
:handler handler})
ret))
此功能立即 returns 通道 ,(据我了解)看起来非常适合作为 JS Promises 对应物。