wait在表达式和语句中的行为是否相似



对于语句,await可以被认为是将后续语句放在.then中。

await对表达式的作用类似吗?

例如,在阻止p2分辨率的进度之前,以下是否阻止了p1分辨率的进度?

const p1 = Promise.resolve()
const p2 = Promise.resolve()
return [await p1, await p2]

await适用于所有表达式。其中x是一个表达式,await x也是一个有效的表达式(异步解析(。该表达式可能是也可能不是独立的语句。

但是,请记住,await总是按顺序处理。您的

return [await p1, await p2]`

将等待p1解析,然后等待p2解析,然后返回包含这两个解析值的数组。通常,在这种情况下,您会希望使用Promise.all来代替:

return Promise.all([p1, p2])

如果你不这样做,你可能会遇到未处理的拒绝——例如,如果p2拒绝,而它不是await

(async () => {
const p1 = new Promise(res => setTimeout(res, 1000));
const p2 = new Promise((res, rej) => setTimeout(rej));
return [await p1, await p2];
})()
.catch(() => {
console.log('error caught');
});

window.addEventListener('unhandledrejection', () => {
console.log('unhandled rejection; p2 was not being awaited at the time it rejected');
});

(此外,如果您有一个返回Promise而不是现有Promises的函数调用,Promise.all方法将更快地解析,因为它将等待Promises并行解析(

await表达式重写为单独的语句:

const p1 = Promise.resolve()
const p2 = Promise.resolve()
const _temp1 = await p1
const _temp2 = await p2
return [_temp1, _temp2]

然后您可以将它们转换为等效的then代码:

const p1 = Promise.resolve()
const p2 = Promise.resolve()
return Promise.resolve(p1).then(_temp1 => {
return Promise.resolve(p2).then(_temp2 => {
return [_temp1, _temp2]
})
})

最新更新