【问题标题】:How to merge the all the callback results in final callback using Async parallel如何使用异步并行将所有回调结果合并为最终回调
【发布时间】:2016-06-14 05:06:54
【问题描述】:

在这种情况下,我必须执行多个 CLI 命令,这些命令返回 JSON,读取每个结果并获取特定字段,最后将它们合并为最终的 JSON。所有 CLI 命令都是相互独立的。

var merge = require('./object-assign');

async.parallel(
  [
    function(callback) {
      var response = {},
          error {};
      var test = exec(command);

      test.stdout.on('data', function(data) {
        response = data;
      });

      test.stderr.on('data', function(data) {
        error.message = data;
      });

      test.on('close', function() {
        //callback1
        callback(error, response);
      })
    }, 

    function(callback) {
      var response = {},
          error {};
      var test = exec(command);
      test.stdout.on('data', function(data) {
        response = data;
      });

      test.stderr.on('data', function(data) {
        error.message = data;
      });

      test.on('close', function() {
        //callback2
        callback(error, response);
      })
    }
    //Few more callbacks 

  ], function(err, results) {
    //using object-assign to merge
    var test = merge(result[0], result[1]);
    //when callback1 completes result[0] is getting values where as result[1]
    //is undefined since it is getting executed.
  }
);

callback1 首先完成并将响应发送到最终回调并返回结果,callback2 完成并发送其响应。 如何确保所有回调都在最终回调中完成,以便我可以合并结果以获得最终的JSON

异步并行是正确的方法吗?如果不是,什么是最适合这种情况的?

【问题讨论】:

  • 它应该已经完成​​了您的要求。在解决所有并行函数之前,它不会到达最终回调
  • 你检查err变量了吗?您的callback2 可能导致错误...

标签: javascript node.js async.js


【解决方案1】:

阅读 async.js parallel

的参考资料

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

注意:并行是关于并行启动 I/O 任务,而不是关于并行执行代码。如果您的任务不使用任何计时器或执行任何 I/O,它们实际上将被串行执行。每个任务的任何同步设置部分都将一个接一个地发生。 JavaScript 保持单线程。

例子:

async.parallel([
    function(callback){
        setTimeout(function(){
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'two');
        }, 100);
    }
],
function(err, results){
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.

    //manipulate the responses
    //JSON.stringify(results);
});

【讨论】:

  • 非常感谢@jherax。我没有使用 I/O 任务或超时,看起来它正在串行执行。当我进行控制台输出时:这就是我得到输出的方式:打印回调 1 - [对应​​对象];导致最终回调 - [仅打印 callback1 值];打印回调 2 - [对应​​对象];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多