尝试使用async.forEach Serial但失败 – Node.js

forEach,我正在使用asynchronous库。 在foreach循环中,我将调用不同的服务并获取数据。 这些数据应该是为了处理它在我看来,因为这些是一些着装细节,需要有序。 所以我试图通过添加外部服务callback内的done()使foreach循环同步。

 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顺序获取数组键。

据我所知,我认为如果你在callback中使用done() ,直到callback返回,forEach循环将会等待。

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

你可以给我任何build议,以便我可以解决我的问题,可以使用比asynchronous其他库。

提前致谢 。

async.forEach()async.forEach()的别名,文档说:

请注意,由于此函数并行地将迭代应用于每个项目,因此不能保证迭代函数将按顺序完成。

你在找什么是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的错误pipe理也有一个问题:

 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 }); 

您可以使用匿名函数来更正索引:

 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) });