显着差异:在不同的地方处理 Promise 拒绝
return somePromise
将somePromise传递给调用站点,并将await
somePromise 传递给调用站点(如果有的话)。因此,如果somePromise 被拒绝,则不会由本地catch 块处理,而是由调用站点的catch 块处理。
async function foo () {
try {
return Promise.reject();
} catch (e) {
console.log('IN');
}
}
(async function main () {
try {
let a = await foo();
} catch (e) {
console.log('OUT');
}
})();
// 'OUT'
return await somePromise
将首先等待somePromise在本地解决。因此,值或异常将首先在本地处理。=> 如果somePromise
被拒绝,将执行本地 catch 块。
async function foo () {
try {
return await Promise.reject();
} catch (e) {
console.log('IN');
}
}
(async function main () {
try {
let a = await foo();
} catch (e) {
console.log('OUT');
}
})();
// 'IN'
原因:return await Promise
在本地和外部都return Promise
等待,只在外部等待
详细步骤:
回报Promise
async function delay1Second() {
return delay(1000);
}
- 打电话
delay1Second()
;
const result = await delay1Second();
- 在内部
delay1Second()
,函数delay(1000)
立即返回一个Promise[[PromiseStatus]]: 'pending
。让我们称之为delayPromise
。
async function delay1Second() {
return delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
}
- 异步函数会将它们的返回值包装在
Promise.resolve()
( Source ) 中。因为delay1Second
是一个异步函数,我们有:
const result = await Promise.resolve(delayPromise);
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
Promise.resolve(delayPromise)
delayPromise
不做任何事情就返回,因为输入已经是一个Promise(参见MDN Promise.resolve):
const result = await delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
await
等到delayPromise
事情解决了。
- IF
delayPromise
满足 PromiseValue=1:
const result = 1;
// jump to catch block if there is any
返回等待Promise
async function delay1Second() {
return await delay(1000);
}
- 打电话
delay1Second()
;
const result = await delay1Second();
- 在内部
delay1Second()
,函数delay(1000)
立即返回一个Promise[[PromiseStatus]]: 'pending
。让我们称之为delayPromise
。
async function delay1Second() {
return await delayPromise;
// delayPromise.[[PromiseStatus]]: 'pending'
// delayPromise.[[PromiseValue]]: undefined
}
- 本地等待将等到
delayPromise
解决。
- 情况 1 :
delayPromise
以 PromiseValue=1 实现:
async function delay1Second() {
return 1;
}
const result = await Promise.resolve(1); // let's call it "newPromise"
const result = await newPromise;
// newPromise.[[PromiseStatus]]: 'resolved'
// newPromise.[[PromiseValue]]: 1
const result = 1;
// jump to catch block inside `delay1Second` if there is any
// let's say a value -1 is returned in the end
const result = await Promise.resolve(-1); // call it newPromise
const result = await newPromise;
// newPromise.[[PromiseStatus]]: 'resolved'
// newPromise.[[PromiseValue]]: -1
const result = -1;
词汇表:
- 定居:
Promise.[[PromiseStatus]]
从pending
变为resolved
或rejected