尝试使用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) });