我有一个函数,它通过回调函数返回其结果。几乎像多个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))
答案 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函数,然后最终将结果返回给调用者。