如何使用异步并行将所有回调结果合并到最终回调中

How to merge the all the callback results in final callback using Async parallel

本文关键字:回调 合并 结果 异步并行 何使用      更新时间:2023-09-26

我有这种情况,我必须执行多个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 的最终回调,回调 2 完成并发送其响应。如何确保所有回调都在最终回调中完成,以便我可以合并结果以获得最终JSON

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

阅读异步

.js并行的参考

并行运行函数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);
});