异步等待承诺全部与存储在变量中
我在看MDN 文档async await,发现有一种替代 promise.all 的方法
所以,
如果coffee,tea和description是我们可以等待的三个承诺
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之前拒绝.catch或await连接到它,则会导致未处理的拒绝。
未经处理的拒绝,就像未经处理的错误一样,是丑陋的,应该避免。在 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`.