gox*_*784 2 javascript asynchronous async-await
我在看MDN 文档async await,发现有一种替代 promise.all 的方法
所以,
如果coffee,tea和description是我们可以等待的三个承诺
let values = await Promise.all([coffee, tea, description]);
Run Code Online (Sandbox Code Playgroud)
但是 MDN 也给出了慢速和快速异步等待的例子:
慢异步等待示例:
async function timeTest() {
await timeoutPromise(3000);
await timeoutPromise(3000);
await timeoutPromise(3000);
}
Run Code Online (Sandbox Code Playgroud)
快速异步等待示例:
async function timeTest() {
const timeoutPromise1 = timeoutPromise(3000);
const timeoutPromise2 = timeoutPromise(3000);
const timeoutPromise3 = timeoutPromise(3000);
await timeoutPromise1;
await timeoutPromise2;
await timeoutPromise3;
}
Run Code Online (Sandbox Code Playgroud)
我对快速异步等待感到困惑。它的工作原理类似于promise.all()吗?是不是比promise.all()?
如果我们在不同的行中编写多个等待,它与慢速异步等待有什么不同?
这个片段:
async function timeTest() {
await timeoutPromise(3000);
await timeoutPromise(3000);
await timeoutPromise(3000);
}
Run Code Online (Sandbox Code Playgroud)
只有在最后一个完成后才会初始化每个 Promise。
相比之下,这个片段:
async function timeTest() {
const timeoutPromise1 = timeoutPromise(3000);
const timeoutPromise2 = timeoutPromise(3000);
const timeoutPromise3 = timeoutPromise(3000);
await timeoutPromise1;
await timeoutPromise2;
await timeoutPromise3;
}
Run Code Online (Sandbox Code Playgroud)
将一次初始化所有承诺。那么,就会
但是第二个片段有一个严重的缺陷:如果其中一个承诺碰巧被拒绝,它可能会导致未经处理的拒绝,尽管await它之前有一个。例如,如果timeoutPromise1尚未解决并timeoutPromise2拒绝,则可能会发生这种情况:
async function timeTest() {
await timeoutPromise(3000);
await timeoutPromise(3000);
await timeoutPromise(3000);
}
Run Code Online (Sandbox Code Playgroud)
出现这个问题是因为 Promise 必须在它 rejects 的点上被awaited 或.catch链接到它上面。如果它在a之前拒绝.catch或await连接到它,则会导致未处理的拒绝。
未经处理的拒绝,就像未经处理的错误一样,是丑陋的,应该避免。在 Node 中,未处理的拒绝不仅是bad,它们也已被弃用,并且可能使 Node 进程完全崩溃。
因此,使用Promise.all比第二个代码段更好的方法。
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |