我的任务是通过在数据库上进行查询来搜索某些单词的含义,为此我正在对该数据库进行异步调用,每个请求都将查找n个术语。我遇到的问题是我想再调用一次,例如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
当然,您可以跟踪手动完成了哪些回调,但是如果您必须做很多事情,这可能会很痛苦并且很容易出错。也许您可以从以下解决方案之一中受益:
我个人喜欢使用caolan的async。它具有许多对管理异步操作有用的功能。您正在寻找的那个可能是parallel
(docs):
parallel(tasks, [callback])
tasks
并行运行功能数组,而无需等到之前的功能完成。如果任何一个函数将错误传递给其回调,则将callback
立即使用该错误的值调用main函数。一旦tasks
已经完成,结果被传递给最终callback
为一个数组。
因此,您将执行以下操作:
async.parallel([
asyncFunctionOne,
asyncFunctionTwo,
asyncFunctionThree
], function(error, results) {
// ...
});
在异步操作之上,Promise是一个很好的抽象。承诺表示现在存在或将来存在的价值;您不必关心哪个。您可以通过创建包含所有承诺的新承诺来等待多个承诺完成。一个节点最受欢迎的承诺库是q乘以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) {
// ...
}));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句