我的任务是通过查找我正在对数据库进行异步调用的数据库来搜索某些单词的含义,每个请求都会查找多个术语。 我遇到的问题是我想调用另一个回调,比如,grand_callback,这个回调的目标是聚合来自所有其他回调的数据,并在聚合所有数据后处理下一组代码。
有没有办法可以实现相同的效果..
一些细节:
terms = [........] // 1000 terms
grand_callback = () ->
#called with aggreagted data.
getbucket_data = (bucket ,callback) ->
#some treatment over terms
callback null , data
some_func = (term) ->
bucket.push term
if bucket.length is 15{
getbucket_data bucket , (err, data)->
#i need to aggregate this data
}
_.map terms , some_func
答案 0 :(得分:0)
当然,您可以直接跟踪哪些回调是手动完成的,但如果您需要做很多事情,这可能会非常容易出错。也许您可以从以下解决方案中受益:
我个人喜欢使用async by caolan。它有一个bunch of functions,可用于管理异步操作;您正在寻找的那个可能是parallel
(docs):
<强>
parallel(tasks, [callback])
强>并行运行
tasks
函数数组,无需等到上一个函数 功能已经完成。如果任何函数将错误传递给它 回调,主callback
立即被调用错误的值。 完成tasks
后,结果将作为结果传递给最终callback
阵列。
所以你会做类似的事情:
async.parallel([
asyncFunctionOne,
asyncFunctionTwo,
asyncFunctionThree
], function(error, results) {
// ...
});
Promise是异步操作的一个很好的抽象。承诺代表现在存在或将来存在的价值;你不必关心哪个。您可以通过创建包含所有承诺的新承诺来等待多个承诺完成。 Node最受欢迎的承诺库之一是Q by kriskowal。
// creating a promise manually
var deferred1 = Q.defer();
var promise1 = deferred1.promise;
asyncFunction1(function(err, value) {
if (err) deferred1.reject(err);
else deferred1.resolve(value);
});
// wrapping a Node-style function to create promises
var promise2 = Q.nfcall(asyncFunction2, arg1, arg2);
// Create a promise that waits for all other promises
var grandPromise = Q.all([promise1, promise2]);
grandPromise.then(Q.spread(function(promise1result, promise2result) {
// ...
}));