异步等待承诺全部与存储在变量中

我在看MDN 文档async await,发现有一种替代 promise.all 的方法

所以,

如果coffee,teadescription是我们可以等待的三个承诺

let values = await Promise.all([coffee, tea, description]);

但是 MDN 也给出了慢速和快速异步等待的例子:

慢异步等待示例:

async function timeTest() {
  await timeoutPromise(3000);
  await timeoutPromise(3000);
  await timeoutPromise(3000);
}
async function timeTest() {
  await timeoutPromise(3000);
  await timeoutPromise(3000);
  await timeoutPromise(3000);
}
async function timeTest()
async function timeTest() {
  const timeoutPromise1 = timeoutPromise(3000);
  const timeoutPromise2 = timeoutPromise(3000);
  const timeoutPromise3 = timeoutPromise(3000);

  await timeoutPromise1;
  await timeoutPromise2;
  await timeoutPromise3;
}
async function timeTest() {
  const timeoutPromise1 = timeoutPromise(3000);
  const timeoutPromise2 = timeoutPromise(3000);
  const timeoutPromise3 = timeoutPromise(3000);

  await timeoutPromise1;
  await timeoutPromise2;
  await timeoutPromise3;
}

快速异步等待示例:

我对快速异步等待感到困惑。它的工作原理类似于promise.all()吗?是不是比promise.all()?

如果我们在不同的行中编写多个等待,它与慢速异步等待有什么不同?

回答

这个片段:

只有在最后一个完成后才会初始化每个 Promise。

  • 初始化第一个 Promise
  • 等待它完成(3 秒)
  • 初始化第二个承诺(...等)

相比之下,这个片段:

将一次初始化所有承诺。那么,就会

  • 等待第一个 Promise 解决
  • 等待第二个 Promise 解决
  • 等待第三个 Promise 解决

但是第二个片段有一个严重的缺陷:如果其中一个承诺碰巧被拒绝,它可能会导致未经处理的拒绝,尽管await它之前有一个。例如,如果timeoutPromise1尚未解决并timeoutPromise2拒绝,则可能会发生这种情况:

出现这个问题是因为 Promise 必须在它 rejects 的点上被awaited 或.catch链接到它上面。如果它a之前拒绝.catchawait连接到它,则会导致未处理的拒绝。

未经处理的拒绝,就像未经处理的错误一样,是丑陋的,应该避免。在 Node 中,未处理的拒绝不仅是bad,它们也已被弃用,并且可能使 Node 进程完全崩溃。

因此,使用Promise.all比第二个代码段更好的方法。

  • @goxarad784 The Promises are initialized at once, so they all run in parallel, but their resolutions are waited for in serial. If none reject, it'll be the same as `Promise.all`.

以上是异步等待承诺全部与存储在变量中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>