2016-10-01 38 views
2

我正在使用異步方法來遍歷並構建一個名爲coupon_bo的對象。在processbo功能裏面出乎意料的是,我看到了一個副作用,其中coupon_bo對象的最後一個副本可用於processbo函數。async nodejs中的每個變量作用域

我的理解是,由於coupon_bo對於每次迭代都是局部的,因此應該有一個用於迭代的新對象。

我錯過了什麼嗎?

function hitApplyLogic(coupon_names, coupons_list, req, callback) { 
    async.each(coupon_names, function(coupon_name, callback) { 
     var coupon_bo = new coupon_objects.CouponsBO(); 
     coupon_bo.incoming_request = req.body; 
     coupon_bo.incoming_request['coupon_code'] = coupon_name.cn; 
     coupon_bo.incoming_request['list_offers'] = true; 

     setTimeout(function() 
     { 
      console.log("CONSOLE-BO: " + JSON.stringify(coupon_bo)); 

     }, 1000); 
    }); 
} 
+0

請放些代碼,像你在哪裏調用回調和所有 –

+0

async.each()異步運行並可能破壞你的數據'coupon_bo'。您可能喜歡使用'async.eachSeries()'或使用'this.coupon_bo'而不是'var coupon_bo' –

+0

@ suraj99934在函數內部調用回調函數(result){} –

回答

0

這裏是你的問題的解決方案,Async's each immediately prints out all elements

async.eachSeries()將在同一時間,在那裏async.each()會遍歷所有項目同時並行遍歷數組項之一。

+0

我需要並行性 –

+0

如果你想並行操作沒有錯誤迭代,我建議你在'async.each'裏面使用'async.waterfall'(http://caolan.github.io/async/docs.html#.waterfall)來在每個迭代中調用你的函數。 –

1

async.each無法保證按順序運行任務。

documentation:

。注意,因爲該功能適用​​iteratee並行的每個項目,也不能保證iteratee功能將在順序完成。

我不確定你的意思是processbo函數。但是var coupon_bo應該對運行的迭代器的每個實例都是唯一的。所以不應該被其他人覆蓋。

我也不確定你爲什麼使用setTimeout在1秒後登錄coupon_bo

我沒有找到的東西在你的執行缺少這是調用的iteratee async.each(coupon_names, function(coupon_name, callback) {

callback功能如果不調用它,你會永遠困在async.each

function hitApplyLogic(coupon_names, coupons_list, req, callback) { 
    async.each(coupon_names, function(coupon_name, eachCallback) { //Changed callback to eachCallback to avoid confusion with the one received in hitApplyLogic 
     var coupon_bo = new coupon_objects.CouponsBO(); 
     coupon_bo.incoming_request = req.body; 
     coupon_bo.incoming_request['coupon_code'] = coupon_name.cn; 
     coupon_bo.incoming_request['list_offers'] = true; 

     setTimeout(function() 
     { 
      console.log("CONSOLE-BO: " + JSON.stringify(coupon_bo)); 
      eachCallback(null); // Finished doing all the work with this particular coupon_name 
     }, 1000); 
    }, 
    , function(err) { //This function is called once all the coupon_names were processed 

     if(err) { 
      // One of the coupon_names returned an error 
      console.log('One of the coupon_names returned an error'); 
      return callback(err); // Callback received in hitApplyLogic 
     } else { 
      // Everything went OK! 
      console.log('All coupons were constructed'); 
      return callback(null); // Callback received in hitApplyLogic 
     }); 
}