async函数返回值总是promise:return普通值→fulfilled promise,return promise→直接透传,throw→rejected promise;引擎用wrapintopromise规范处理,等价于对非promise值调用promise.resolve()。

async 函数的返回值**总是被自动包装成 Promise**,这是 JavaScript 引擎内置的行为,不是 Promise.resolve() 显式调用的结果。但它的效果等价于用 Promise.resolve() 包了一层 —— 所以常被通俗地说成“被 Promise.resolve 自动包装”。
async 函数的返回值本质是 Promise
无论你在 async 函数里 return 什么,函数调用结果都是一个 Promise 对象:
- return 一个普通值(如 42、"hello"、{})→ 返回 fulfilled 状态的 Promise,值为该值
- return 一个 Promise → 返回该 Promise(不额外嵌套,也不会被 resolve 二次包裹)
- 抛出异常 → 返回 rejected 状态的 Promise,reason 就是那个错误
例如:
async function f1() { return 123; }
async function f2() { return Promise.resolve(456); }
async function f3() { throw new Error('oops'); }
f1() // → Promise {<strong>fulfilled</strong>: 123}
f2() // → Promise {<strong>fulfilled</strong>: 456}(不是 Promise{Promise{456}})
f3() // → Promise {<strong>rejected</strong>: Error: oops}
为什么说“等价于 Promise.resolve()”?
对于非 Promise 的返回值,引擎内部行为与下面代码逻辑一致:
// 你写:
async function foo() { return 'abc'; }
// 引擎实际处理类似:
function foo() {
return Promise.resolve('abc'); // ✅ 效果一样
}
注意:这不是字面意义的调用 Promise.resolve(),而是规范定义的抽象操作 WrapIntoPromise(见 ECMAScript 规范),它对非 Promise 值调用 Promise.resolve(),对已经是 Promise 的值直接返回(不做重复包装)。
不会发生“双重包装”
如果你 return 一个 Promise,它不会被再包一层:
async function g() {
return Promise.reject('bad');
}
g() // → Promise {<strong>rejected</strong>: 'bad'},不是 Promise{Promise{rejected: 'bad'}}
这说明引擎做了判断:只对非 Promise 值才做 resolve 包装,对 Promise 实例直接透传。
和普通函数 + Promise.resolve 的区别
普通函数不会自动包装:
function normal() { return 789; }
normal() // → 789(不是 Promise)
// 你要手动包装,才得到 Promise:
Promise.resolve(normal()) // → Promise {fulfilled: 789}
而 async 函数省了这一步 —— 它从定义起就承诺返回 Promise,这是语言层面的保障。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











