This question already has an answer here:
How to sequentially run promises with Q in Javascript?
(1个答案)
4年前关闭。
我试图同步执行一系列功能。在调用下一个功能之前,应将每个功能延迟3秒。
我一定做错了,因为3秒钟后它们都被同时调用,而不是按顺序调用。
我究竟做错了什么?
ps。实际上,您实际上可能希望将3s超时直接合并到循环中,而不是合并到
(1个答案)
4年前关闭。
我试图同步执行一系列功能。在调用下一个功能之前,应将每个功能延迟3秒。
我一定做错了,因为3秒钟后它们都被同时调用,而不是按顺序调用。
我究竟做错了什么?
var tasks = []
allGroups.forEach(function(group){
tasks.push(deleteFromGroup(group))
})
tasks.reduce(function(cur, next) {
return cur.then(next);
}, Promise.resolve()).then(function() {
console.log("all executed")
});
})
}
function deleteFromGroup(group){
return new Promise(function(resolve, reject) {
setTimeout(function(){
console.log(group.id)
resolve()
}, 3000);
})
}
最佳答案
创建tasks
数组的方式不可避免地会导致超时几乎同时发生,因为您是在第一个.forEach
循环中同时创建任务的。
要获得效果,您需要在解决当前任务之前实际上不创建下一个任务。这是实现该目标的伪递归方法:
return new Promise(resolve, reject) {
var groups = allGroups.slice(0); // clone
(function loop() {
if (groups.length) {
deleteFromGroup(groups.shift()).catch(reject).then(loop);
} else {
console.log("all executed")
resolve();
}
})();
});
ps。实际上,您实际上可能希望将3s超时直接合并到循环中,而不是合并到
deleteFromGroup
中-如上面的代码(和您的原始代码)所写,直到最后一次delete调用后3s才会显示“完成”,但是我希望它真的应该在最后立即发生。09-20 08:58