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

关于async函数返回Promise的底层执行与非嵌套问题的问询

async/await 底层逻辑解析

一、调用 await myPromise() 的底层过程

  1. 调用 myPromise() 时,因为它是async函数,会立刻创建一个外层Promise(记为P1),随后执行函数内部代码。
  2. 函数内部返回了另一个Promise(记为P2),此时async函数会自动检测到返回值是Promise,于是将P1的状态与P2绑定:当1秒后P2通过resolve('done')变为resolved状态时,P1也会同步变为resolved,并且把P2的结果'done'作为自己的结果;如果P2变为rejected,P1也会同步rejected。
  3. await关键字会暂停当前所在的async函数(假设你在另一个async函数中调用这段代码),直到P1的状态从pending变为resolved。当P1 resolved后,await myPromise()会直接返回'done'这个结果,而非Promise对象。

二、为什么不会出现嵌套Promise?

这是ES规范对async函数的强制要求:async函数的返回值会自动经过Promise.resolve()处理,无论你return的是普通值还是Promise对象,最终都会被扁平化处理成一个顶层Promise。

  • 当你return一个Promise对象(比如这里的P2)时,Promise.resolve(P2)并不会生成嵌套的Promise<Promise<*>>,而是直接“代理”P2的状态——最终返回的Promise(也就是P1)会完全同步P2的状态变化,相当于把P2的结果直接作为自己的结果。
  • 对比无async关键字的情况:直接const myPromise = () => new Promise(...)调用后返回的就是P2;加了async后返回的P1和P2状态完全同步,所以最终调用效果看起来一致,但底层是async函数帮你做了自动扁平化处理,避免了嵌套Promise的问题。

内容的提问来源于stack exchange,提问作者Makis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:50:26