JS中async函数返回Promise:为何await g()输出42而非Promise实例?
为什么async函数返回Promise时,await后得到的是最终值而非Promise?
先看你给出的代码示例:
let f = async function () { return 42; } let g = async function () { return new Promise((resolve, reject) => resolve(42)); } f() -> Promise { ... } await f() -> 42 g() -> Promise { ... } await g() -> 42
你猜的没错,async函数确实会和内部返回的Promise做「合并」,这是ES标准里明确规定的async函数行为:
- 当async函数返回普通值(比如示例里的42),它会自动把这个值包装成一个
resolved状态的Promise,所以直接调用f()得到的是Promise对象,await会提取出这个Promise内部的42。 - 当async函数返回的本身就是一个Promise对象(比如
g()里的返回值),async函数不会把这个Promise再包一层新的Promise,而是直接「接管」这个Promise的状态:如果内部的Promise resolved,async函数返回的Promise也会resolved到同一个值;如果内部Promise rejected,async返回的Promise也会rejected。
简单说,async函数的返回逻辑本质是:它会把返回值转换成一个Promise——如果返回值是thenable(比如Promise),就等待这个thenable完成,然后用它的结果作为自己的Promise结果;如果是普通值,就直接resolve这个值。
所以不管你在async函数里返回普通值还是Promise,await它的返回结果时,都会拿到最终的resolved值,而不是Promise对象本身。
内容的提问来源于stack exchange,提问作者elplatt
相关产品推荐
相关产品推荐

