Node.js回调:返回所有回调后,调用grand_callback

安吉·索兰基(Ankit Solanki)

我的任务是通过在数据库上进行查询来搜索某些单词的含义,为此我正在对该数据库进行异步调用,每个请求都将查找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 
米歇尔·提里(Michelle Tilley)

当然,您可以跟踪手动完成了哪些回调,但是如果您必须做很多事情,这可能会很痛苦并且很容易出错。也许您可以从以下解决方案之一中受益:

1.使用异步库

我个人喜欢使用caolan的async它具有许多对管理异步操作有用的功能您正在寻找的那个可能是parallel docs

parallel(tasks, [callback])

tasks并行运行功能数组,而无需等到之前的功能完成。如果任何一个函数将错误传递给其回调,则将callback立即使用该错误的值调用main函数。一旦tasks已经完成,结果被传递给最终callback为一个数组。

因此,您将执行以下操作:

async.parallel([
  asyncFunctionOne,
  asyncFunctionTwo,
  asyncFunctionThree
], function(error, results) {
  // ...
});

2.兑现承诺

在异步操作之上,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章