如何使用Async parallel将所有回调结果合并到最终回调中

时间:2016-03-01 16:51:41

标签: javascript node.js async.js

我有这种情况,我需要多个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首先完成并使用result发送对最终回调的响应,并且callback2完成并发送其响应。 如何确保在最终回调中完成所有回调,以便我可以合并结果以获得最终的JSON

这里的异步方法是异步并行吗?如果没有,这种情况最好的是什么?

1 个答案:

答案 0 :(得分:3)

阅读参考资料 async.js parallel

  

并行运行html.on('data', function(data) { // <-- here I try to use the template text data = data.toString().replace('{title}', title); console.log(data); res.write(data); }); html.on('end', function(data) { res.end(); }); //html.pipe(res); 函数数组,无需等到上一个函数完成。如果任何函数将错误传递给其tasks,则会立即使用错误值调用主callback。完成callback后,结果将作为tasks传递给最终callback

     

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

示例:

array