尝试连续使用 async.forEach 但失败 - Node.js
Trying to use async.forEach Serially but Fails - Node.js
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()
,直到回调 returns,forEach 循环将等待。
async.forEach
的工作方式是否不同?
你能给我任何建议,以便我可以解决我的问题,可能会使用异步以外的其他库。
提前致谢。
您可以使用匿名函数来更正索引:
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)
});
async.forEach()
是 async.each
的别名,文档说:
Note, that since this function applies iteratee to each item in parallel, there is no guarantee that the iteratee functions will complete in order.
您要找的是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
});
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()
,直到回调 returns,forEach 循环将等待。
async.forEach
的工作方式是否不同?
你能给我任何建议,以便我可以解决我的问题,可能会使用异步以外的其他库。
提前致谢。
您可以使用匿名函数来更正索引:
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)
});
async.forEach()
是 async.each
的别名,文档说:
Note, that since this function applies iteratee to each item in parallel, there is no guarantee that the iteratee functions will complete in order.
您要找的是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
});