clojurescript 等待回调

clojurescript waiting for callback

我有一个函数,returns 其结果由回调函数提供。几乎就像多个 http 请求库一样。

很多时候我需要多次调用这个函数来获取不同的数据。

(get-data "key-a" (fn [res-a]
  (get-data "key-b" (fn [res-b]
    (get-data "key-c" (fn [res-c]
      (do-something res-a res-b res-c))))))) 

我正在尝试构建一个函数,使上面的工作像这样:

(get-multi-data ["key-a" "key-b" "key-c"] 
                do-something)

我应该获取向量中请求的数据并将结果传递给回调。问题一:这样的函数怎么看?

问题2:是否可以通过core.async做一个简单returns数据的函数?并完全隐藏回调?

(let [res (get-multi-data ["key-a" "key-b" "key-c"])]
  (do-something res))

您可以为给定的 get-data 函数定义 returns 一个 get-muti-data 函数的函数:

(defn multi-caller [data-getter] 
   (fn [xs callback]  
      (let [f (fn f [xs res] 
                (if (seq xs) 
                    (data-getter (first xs) #(f (rest xs) (conj res %)))
                    (apply callback res)))] 
           (f xs []))))

这将允许您编写

((multi-caller get-data) 
   ["key-a" "key-b" "key-c"] 
   do-something)

实现你的要求。

请注意,get-data 调用将按顺序执行,因此您不会受益于并行性。


至于core.async,go-blocks里面的好玩的东西你都要做。 不可能定义一个普通的 clojurescript 函数来完成所有异步操作,然后 then 最终 returns 向调用者提供结果。