2013-11-25 147 views
19

我需要從兩個Web服務器請求數據。任務是獨立的;因此,我正在使用aync.parallel。現在我只在自己的網頁上寫上'abc','xyz'和'Done'。瞭解Node.JS async.parallel

由於任務在同一時間執行,我可以遇到一個奇怪的輸出?例如,

xab 
cyz 

的代碼。

var async = require('async'); 

function onRequest(req, res) { 
    res.writeHead(200, { 
     "Content-Type" : "text/plain" 
    }); 

    async.parallel([ function(callback) { 
     res.write('a'); 
     res.write('b'); 
     res.write('c\n'); 
     callback(); 
    }, function(callback) { 
     res.write('x'); 
     res.write('y'); 
     res.write('z\n'); 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("\nDone!"); 
    }); 

} 

var server = require('http').createServer(onRequest); 
server.listen(9000); 
+1

寫入'res'的順序取決於哪個async.parallel任務首先完成,但是因爲任務是獨立的,而不是順序應該無關緊要。 – Bulkan

+0

@Bulkan,謝謝。但「並行」似乎不能正常工作。請閱讀[一個新問題](http://stackoverflow.com/questions/20186787/node-js-async-parallel-doesnt-wait-until-all-the-tasks-have-completed)。 –

回答

37

如果你想在其結果的打印順序絕對肯定,你應該通過callbacks傳遞數據(abc\nxyz\n)(第一個參數是錯誤)和處理/寫出來在最後的async.parallel回調的results的說法。

async.parallel([ 
    one: function(callback) { 
     callback(null, 'abc\n'); 
    }, 
    two: function(callback) { 
     callback(null, 'xyz\n'); 
    } 
], function(err, results) { 
    // results now equals to: [one: 'abc\n', two: 'xyz\n'] 
}); 
+0

我可以傳遞參數,但我應該在並行函數內執行長操作 –

+0

我假設你正在做一些長操作來獲取兩個字符串(可能來自數據庫),建議分離用於檢索數據的代碼(並行)和處理('res.write')它(順序)。 –

+0

這是天才,謝謝 –