You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:01:46