我试图在一个项目数组上运行一个async.each。
对于每个项目,我想运行一个async.waterfall。请参阅下面的代码。
var ids = [1, 2];
async.each(ids,
function (id, callback) {
console.log('running waterfall...');
async.waterfall([
function (next) {
console.log('running waterfall function 1...');
next();
},
function (next) {
console.log('running waterfall function 2...');
next();
}],
function (err) {
if (err) {
console.error(err);
}
else {
console.log('waterfall completed successfully!');
}
callback();
});
},
function (err) {
if (err) {
console.error(err);
}
else {
console.log('each completed successfully!');
}
});
return;此代码的输出如下所示:
running waterfall...
running waterfall function 1...
running waterfall...
running waterfall function 1...
running waterfall function 2...
running waterfall function 2...
waterfall completed successfully!
waterfall completed successfully!
each completed successfully!但我的意图是,我的理解是,产出应该如下所示:
running waterfall...
running waterfall function 1...
running waterfall function 2...
waterfall completed successfully!
running waterfall...
running waterfall function 1...
running waterfall function 2...
waterfall completed successfully!
each completed successfully!我一直在查看代码,我不知道出了什么问题,有人知道我的代码或我对异步方法应该做的事情的期望是否不正确吗?
谢谢!
发布于 2016-03-16 01:07:42
async.each()试图并行地运行循环的所有迭代,因此所有迭代都可能同时运行,并且将以不确定的顺序完成。您可以在.each()中清楚地看到这一点
并行地将函数迭代应用于arr中的每个项。迭代器将使用列表中的项进行调用,并在它完成时调用回调。如果迭代器将错误传递给其回调,则主回调(用于每个函数)将立即与错误一起调用。 注意,由于此函数并行地将iteratee应用于每个项,因此不能保证iteratee函数按顺序完成。
因此,这解释了为什么您的两个.waterfall()迭代同时进行而不是连续运行。
如果您想一个接一个地运行它们,那么您应该使用async.eachSeries()。
https://stackoverflow.com/questions/36025014
复制相似问题