【发布时间】:2018-09-20 15:14:23
【问题描述】:
我想在一个循环中运行一些异步任务,但它应该按顺序执行(一个接一个)。它应该是 vanilla JS,而不是任何库。
var doSome = function(i) {
return Promise.resolve(setTimeout(() => {
console.log('done... ' + i)
}, 1000 * (i%3)));
}
var looper = function() {
var p = Promise.resolve();
[1,2,3].forEach((n) => {
p = p.then(() => doSome(n))
})
return p;
}
looper();
当前输出:
calling for ...1
calling for ...2
calling for ...3
Promise {<resolved>: 8260}
done... 3
done... 1
done... 2
预期输出:
calling for ...1
calling for ...2
calling for ...3
Promise {<resolved>: 8260}
done... 1
done... 2
done... 3
注意:请回答,如果您尝试过并且按预期工作
【问题讨论】:
-
代码以 3、1、2 的顺序执行的唯一原因是您的模数数学错误。
1%3=1,2%3=2但3%3=0,所以 1 等待 1000ms,2 等待 2000ms,但 3 等待 0ms。 -
Promise.resolve(setTimeout(wut... 你意识到它会立即用一个数字解决,因此不会等待超时,对吧? -
我没有看到
calling for ...在您的代码中记录的位置? -
@KevinB - 问题中提出的代码并没有完全达到用户的意图,我不相信。我认为下面我的答案中的第一个 sn-p 更清楚地表示了用户试图描述的内容。
标签: javascript promise async-await es6-promise