2016-02-17 49 views
1

forEach,我正在使用async庫。在foreach循環中,我將調用不同的服務並獲取數據。這些數據應該是爲了處理它在我看來,因爲這些是一些衣服的細節,需要按順序。所以我試圖通過在外部服務回調中添加done()來使foreach循環同步。嘗試使用async.forEach Serial但失敗 - Node.js

var address_deails = []; 
var x = 0; 

async.forEach(lat_long, function (item, done) { 
    external_servie(item,config,function (err, data) { 
     if (err) { 
      callback(err, null); 
     } else { 
      //code here ....... 
      address_deails[x] = //some_data; 
     } 
     x++; 
     done(); <------------- Here 
    }); 
}, function(err) { 
    if(err) { 
     callback(err,null) 
    } else { 
     callback(err,address_deails) 
    } 
}); 

但我每次都以不同的順序獲取值。我想獲得像0,1,2這樣的數組鍵。

據我所知,我認爲如果你在回調中使用done(),直到回調返回,forEach循環將會等待。

async.forEach的工作方式是否有所不同?

你可以給我任何建議,以便我可以解決我的問題,可以使用其他庫而不是異步。

在此先感謝。

+0

是否'async'有'forEach'? – Jai

+0

您使用的是什麼版本的異步?我認爲目前沒有forEach? async.each不保證系列將按順序運行。 – Seonixx

+0

@Seonixx我的版本是1.4.2 –

回答

2

async.forEach()async.each的別名和醫生說:

。注意,因爲該功能適用​​iteratee到每個項目並行,不能保證迭代函數將按順序完成。

什麼你要找的是async.eachSeries()/async.forEachSeries()

async.eachSeries(lat_long, function (item, done) { 
    external_servie(item,config,function (err, data) { 
     if (err) { 
      callback(err, null); 
     } else { 
      //code here ....... 
      address_deails[x] = //some_data; 
     } 
     x++; 
     done(); <------------- Here 
    }); 
}, function(err) { 
    if(err) { 
     callback(err,null) 
    } else { 
     callback(err,address_deails) 
    } 
}); 

現在你可以推到address_deails,而不是維持指數:address_deails.push(/* some data */);

還有你的external_service的錯誤管理的問題:

external_servie(item,config,function (err, data) { 
    if (err) { 
     done(err); // <<< call done with the error to stop the loop or it will continue 
    } else { 
     //code here ....... 
     address_deails.push(/* some data */);   
    } 
    done(); <------------- Here 
}); 
0

您可以使用匿名函數來修正指標:

async.forEach(lat_long, function (item, done) { 
    (function(index) { 
    external_servie(item,config,function (err, data) { 
     if (err) { 
      callback(err, null); 
     } else { 
      //code here ....... 
      address_deails[index] = //some_data; 
     } 
     done(); <------------- Here 
    }); 
    })(x); 
    x++ 
}, function(err) { 
     console.log(err,address_deails) 
});