关于async函数返回Promise的底层执行与非嵌套问题的问询
async/await 底层逻辑解析
一、调用 await myPromise() 的底层过程
- 调用
myPromise()时,因为它是async函数,会立刻创建一个外层Promise(记为P1),随后执行函数内部代码。 - 函数内部返回了另一个Promise(记为P2),此时async函数会自动检测到返回值是Promise,于是将P1的状态与P2绑定:当1秒后P2通过
resolve('done')变为resolved状态时,P1也会同步变为resolved,并且把P2的结果'done'作为自己的结果;如果P2变为rejected,P1也会同步rejected。 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
相关产品推荐
相关产品推荐

