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 向调用者提供结果。
我有一个函数,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 向调用者提供结果。