对于语句,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]
})
})