clojurescript等待回调

时间:2018-03-01 07:09:22

标签: asynchronous callback clojurescript

我有一个函数,它通过回调函数返回其结果。几乎像多个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)

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

问题2:是否可以通过使用core.async来制作一个简单的返回数据的功能?并完全隐藏回调?

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

1 个答案:

答案 0 :(得分:0)

您可以为给定的get-muti-data函数定义一个返回get-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函数,然后最终将结果返回给调用者。