javascript - 如何等待 Promise.all 中的 2 个 Promise 完成然后执行另一项任务

标签 javascript node.js promise async-await

我目前正在开发一个程序,我需要使用 Promise.all 同时运行几个函数。但在我继续执行任务之前,我只需要完成 2 个 promise ,然后运行 ​​.then(),我将如何去做呢?

示例:

await Promise.all([Task1(),Task2(),Task3(),Task4(),Task5()]);

当(例如)Task1 和 Task 4 完成时,我需要它来继续代码。

我尝试使用 while 循环进行实验,通过在完成时设置变量来等待 Task1 和 Task2 完成,但是那样。根本不起作用。

最佳答案

在评论中,您似乎已经说过您事先明确知道哪两个任务比其他任务更紧急(在本例中,是任务 1 和任务 4)。

然后只需使用 Promise.all 两次:

const allResults = Promise.all([
    Promise.all([Task1(), Task4()])
    .then(([result1, result4]) => {
        // Those two are done, do what you like with `result1` and `result4`...
        return [result1, result4];
    }),
    Task2(),
    Task3(),
    Task5()
])
.then(([[result1, result4], result2, result3, result5]) => {
    // All five are done now, let's put them in order
    return [result1, result2, result3, result4, result5];
})
.then(/*...*/)
.catch(/*...*/);

在那里,我通过重新映射整个 then 处理程序中的顺序,保留了外链中的总体 1、2、3、4、5 顺序。

<小时/>

最初,我假设您想等到任何两个完成,而不是特定的两个完成。虽然没有内置的功能,但编写起来很容易:

function enough(promises, min) {
  if (typeof min !== "number") {
    return Promise.all(promises);
  }
  let counter = 0;
  const results = [];
  return new Promise((resolve, reject) => {
    let index = 0;
    for (const promise of promises) {
      let position = index++;
      promise.then(
        result => {
          results[position] = result;
          if (++counter >= min) {
            resolve(results);
          }
        },
        reject
      );
    }
  });
}

实例:

function enough(promises, min) {
  if (typeof min !== "number") {
    return Promise.all(promises);
  }
  let counter = 0;
  const results = [];
  return new Promise((resolve, reject) => {
    let index = 0;
    for (const promise of promises) {
      let position = index++;
      promise.then(
        result => {
          results[position] = result;
          if (++counter >= min) {
            resolve(results);
          }
        },
        reject
      );
    }
  });
}

const delay = (ms, ...args) => new Promise(resolve => setTimeout(resolve, ms, ...args));
const rnd = () => Math.random() * 1000;

enough(
  [
    delay(rnd(), "a"),
    delay(rnd(), "b"),
    delay(rnd(), "c"),
    delay(rnd(), "d"),
    delay(rnd(), "e")
  ],
  2
)
.then(results => {
  console.log(results);
})
.catch(error => {
  console.error(error);
});

关于javascript - 如何等待 Promise.all 中的 2 个 Promise 完成然后执行另一项任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55611232/

相关文章:

javascript - 将 compose 函数从 javascript 翻译为 python,函数式方式

javascript - 如何添加保存另一个模式数据到模型中?

javascript - Node.js:如何远程调试?

javascript - 我可以提前结束 Promise.each 吗?

javascript - "' npm ' is not recognized as an internal or external command"on create-react-app

javascript - 将数组中对象的最大值显示为两个最大值

javascript - 如何使用 Bluebird 在构造函数构建的 "class"上 promise 导出的函数

javascript - VueJS 异步组件数据和 promise

javascript - 如何使用preventDefault重写而不是return false?

node.js - Mongoose 聚合匹配不适用于正则表达式