【问题标题】:Node.js Callbacks: Call a grand_callback when all callbacks are returnedNode.js 回调:当所有回调都返回时调用一个 grand_callback
【发布时间】:2014-06-03 13:07:59
【问题描述】:

我的任务是通过查找数据库来搜索某些单词的含义,我正在对数据库进行异步调用,每个请求都会查找 sat 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 

【问题讨论】:

  • 您可以使用承诺或您自己的计数器。在任何一种情况下,一些代码都会跟踪对数据库的所有异步调用何时完成(通常通过计算没有更多未完成请求的时间),然后该代码使用累积的数据调用 grand_callback。如果您提供实际的代码结构,人们可以更具体地为您提供帮助。
  • 感谢您的意见。
  • 这里有一些例子hereherehere
  • 感谢大家的建议。

标签: node.js asynchronous callback


【解决方案1】:

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

1。使用异步库

我个人喜欢使用async by caolan。它有一个bunch of functions,可用于管理异步操作;你要找的可能是parallel (docs):

parallel(tasks, [callback])

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

所以你会做这样的事情:

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

2。使用承诺

Promises 是异步操作之上的一个很好的抽象。承诺代表现在存在或将来存在的价值;你不必关心哪个。您可以通过创建一个包含所有 Promise 的新 Promise 来等待多个 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) {
  // ...
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多