javascript - 连续执行和延迟一系列 promise

标签 javascript node.js promise

<分区>

我正在尝试使用 同步执行一系列功能。在调用下一个功能之前,每个功能都应该延迟 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();
        }
    })();
});

附注在实践中,您实际上可能希望将 3s 超时直接合并到循环中,而不是合并到 deleteFromGroup 中 - 如上面的代码(和您的原始代码)所写,直到 3s 最后的删除调用之后,但我希望它真的应该在结束时立即发生。

关于javascript - 连续执行和延迟一系列 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693426/

相关文章:

javascript - Nodejs 在工作一段时间后停止响应请求

javascript - 尝试在 node.js 中使用 promise 时出错

javascript - 这是在 Sequelize.js 中使用 Promise 的正确方法吗?

javascript - jQuery 脚本在控制台中运行,但不在文件中运行

javascript - 添加和新列/属性以 Sequelize 模型

javascript - 使用 jquery 识别文本并将其加热到容器内

javascript - 打包flow中编写的npm项目

javascript - promise 和 Mocha : done() in before or not?

标题中的 JavaScript 代码位置

javascript - 有属性(property)吗?是否意味着该属性在类实例上可以为 null 或未定义?