Clojure 相当于一个jQuery Deferred?

Clojure's equlivalent to a jQuery Deferred?

Clojure 有 promisefuturedelay 等,但是 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 对应物。