我正在尝试在一系列项目上运行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!
我一直在查看代码而我不知道什么是错的,有人知道我的代码或我对异步方法应该做的事情的期望是不正确的吗?
谢谢!
答案 0 :(得分:4)
layoutMyViews()
makeHttpRequest(callback)
func callback(data: MyData) {
drawData(data, into:dataView)
}
func drawData(data: MyData, into view:UIView) {
let size = view.frame.size
// Here I want to draw data into view, depending on size, but it may be (0,0)
}
尝试并行运行循环的所有迭代,因此所有迭代可能同时在飞行中并且将以不确定的顺序完成。您可以在doc for .each()
:
将函数iteratee并行应用于arr中的每个项目。该 使用列表中的项目调用iteratee,并使用when的回调 它已经完成了。如果iteratee将错误传递给它的回调,那么 主要回调(对于每个函数)立即调用 错误。
注意,因为此函数将iteratee应用于每个项目 并行,不能保证iteratee函数会 按顺序完成。
因此,这解释了为什么你的async.each()
迭代同时进行而不是连续运行。
如果你想一个接一个地运行它们,那么你应该使用它们
而是.waterfall()
。