JS:多个Promise的async/await

4

如果我有两个同步运行的 promise,我该如何等待它们都完成呢?await 不只适用于单个 promise 吗?

async function testing() {
  let promise1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("one"), 1000)
  });

  let promise2 = new Promise((resolve, reject) => {
    setTimeout(() => resolve("two"), 1000)
  });


  // how do I await both of these?
}
3个回答

12
你可以使用 Promise.all 来同时等待它们。
const [result1, result2] = await Promise.all([promise1, promise2]))

5

如果你想要解决所有的Promise,那么你可以使用两种方式,分别是Promise.allSettled()Promise.all()。因此,根据你的需求选择其中一种。

Promise.allSettled()方法返回一个Promise,该Promise在给定的所有Promise完成或拒绝后解析,返回一个每个Promise结果描述对象的数组。

Promise.allSettled([
    Promise.resolve('promise1'),
    Promise.reject('promise2')
]).then(console.log)

当您有多个异步任务且它们不依赖于彼此成功完成,或者您始终希望了解每个 Promise 的结果时,通常会使用 Promise。

相比之下,如果这些任务相互依赖/如果您希望在任何一个任务被拒绝时立即拒绝,则 Promise.all() 返回的 Promise 可能更合适。

Promise.all([Promise1, Promise2])
 .then(result) => {
   console.log(result)
 })
 .catch(error => console.log(`Error in promises ${error}`))

参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled


-1

你可以使用 promise.all 或者 promise.allSettled

如果你的使用场景是,如果任何一个请求失败了,那么操作就需要失败,那么最好使用 promise.all

如果你需要等待所有请求完成,无论中间有没有请求失败,那么你需要使用 promise.allSettled。

但是这两个方法都不能保证串行化。如果你需要保证串行化,我建议使用 for await 循环,并在其中使用 promise.resolve。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接