2012-10-18 162 views
0

在我的Node.js應用程序組成的結果是,我有一個代碼snipplet組成一個CSV陣列:的Node.js:更好的方式來處理從異步回調

function process(alerts, callback) { 
    var csvList = []; 
    var alertsLength = alerts.length; 

    alerts.forEach(function(alert) { 
     var name = alert.name; 
     var msg = alert.msg; 

     // retrieve from database 
     // NOTE: the asynchronous part! 
     PersonDao.getContact(name, function(error, contact) { 
      var csv = "csv:" + contact + "|" + msg; 
      csvList.push(csv); 

      if (csvList.length == alertsLength) { 
       // execute callback with the csvList 
       callback(csvList); 
      } 
     }); 

    }); // end of alerts loop 

} 

是否有更優雅(或正確的)的方式來做到這一點?

+0

我會使用'async.parallel' –

+0

不,這是如何完成的(除了你可能忘記傳遞錯誤)。然而,有些庫通過實現使用這種標準模式的幫助函數來添加語法糖,特別是使用Deferred對象。 – Bergi

+0

如果您打算使用'async',那麼[async.forEachSeries'](https://github.com/caolan/async#foreachseriesarr-iterator-callback)會更適合您,因爲您會失去訂單與'async.parallel'(如果訂單很重要)。 – JohnnyHK

回答

1

只需使用第三方庫。

var async = require('async'); 

function process(alerts, callback) { 
    //  v--- or async.map(...) to do it in parallel 
    async.mapSeries(alerts, function(alert, cb) { 
     PersonDao.getContact(alert.name, function(error, contact) { 
      cb(error, "csv:" + contact + "|" + alert.msg); 
     }); 
    }, callback); 
}