2016-03-01 25 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