2016-03-01 28 views
2

我有这种情况下,我必须多个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

异步并行是否正确?如果不是,这种情况最好的是什么?

+0

应该已经做什么你问。它不会达到最后的回调,直到所有的并行功能得到解决 – Jacob

+0

你检查了'err'变量吗?你的'callback2'可能会导致错误... –

回答

3

取的读取在参考为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); 
}); 
+1

非常感谢@ jherax.I没有使用任何I/O任务或超时,看起来像它正在串行执行。当我做控制台输出:这是我如何得到输出: 打印回调1 - [相应对象]; 导致最终回调 - [仅打印callback1值]; 打印回调2 - [相应对象]; – Vinu