This question already has an answer here:
How to sequentially run promises with Q in Javascript?
                                
                                    (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