return await与return行为是否完全一致?是否存在差异场景?
两个函数的行为差异场景
正常情况下,你给出的两个函数调用后都会返回一个1秒后resolve的Promise,行为看似一致,但存在两种关键场景会产生差异:
场景一:返回的Promise resolve值是另一个Promise/thenable
如果修改函数中的Promise,让它resolve一个嵌套的Promise:
function waitASecA() { const promise = new Promise(resolve => resolve(new Promise(resolve2 => setTimeout(resolve2, 1000)))); return promise; } async function waitASecB() { const promise = new Promise(resolve => resolve(new Promise(resolve2 => setTimeout(resolve2, 1000)))); return await promise; }
- 调用
waitASecA()返回的Promise会立即resolve,resolve的值是内层的Promise对象; - 调用
waitASecB()返回的Promise会等待内层Promise resolve后才完成,最终resolve的值是内层Promise的结果(此处为undefined)。
原因:await promise只会等待外层Promise settle,拿到它resolve的内层Promise后,return await promise等价于直接返回内层Promise,因此最终要等内层Promise完成;而waitASecA直接返回外层Promise,外层Promise在调用resolve时就已完成。
场景二:返回的是自定义thenable对象而非标准Promise
自定义一个带有副作用的thenable对象:
const customThenable = { then(resolve) { console.log("thenable的then方法执行了"); resolve(); } }; function waitASecA() { return customThenable; } async function waitASecB() { return await customThenable; }
- 调用
waitASecA()时,不会立即执行then方法,只有当你调用返回值的.then()或使用await消费它时,才会触发then方法并打印日志; - 调用
waitASecB()时,await会立即触发thenable的then方法,日志会直接打印,最终返回的是一个已resolve的Promise。
原因:await会主动触发thenable的then方法来等待其完成,而直接返回thenable的话,只有外部代码消费这个thenable时才会执行then方法。
补充:如果原函数中的Promise是rejected状态,两者行为完全一致——都会返回一个rejected的Promise,错误信息也相同。
内容的提问来源于stack exchange,提问作者Alex Lomia
相关产品推荐
相关产品推荐

