forEach,我正在使用async库。在foreach循环中,我将调用不同的服务并获取数据。这些数据应该是为了在我看来处理它,因为这些是一些着装细节,需要整理好。所以我试图通过在外部服务回调中添加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
。
据我所知,我认为如果在回调中使用done()
,则在回调返回之前,forEach循环将等待。
async.forEach
的工作方式不同吗?
你能给我任何建议,以便我可以解决我的问题,可以使用其他库而不是异步。
提前致谢。
答案 0 :(得分:3)
async.forEach()
是async.each
的别名,文档说:
注意,由于此函数并行地将iteratee应用于每个项目,因此无法保证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
});
答案 1 :(得分: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)
});