async函数返回值自动封装为Promise,无论return何值(包括undefined)均等价于Promise.resolve();抛出错误则等价于Promise.reject();await仅解包Promise但不改变返回机制;无需手动Promise.resolve包装。

async 函数的返回值**自动被封装为 Promise**,不需要手动包装。只要函数用 async 声明,无论你 return 什么(基本类型、对象、甚至 undefined),JavaScript 引擎都会把它 resolve 成一个 Promise。
返回值直接变成 Promise 的 resolve 值
你写 return 42,实际等价于 return Promise.resolve(42);你写 return null 或 return(无返回),也等价于 Promise.resolve(undefined)。
-
async function foo() { return "hello"; }→ 返回Promise<string> -
async function bar() { return [1, 2, 3]; }→ 返回Promise<number[]> -
async function baz() {}→ 返回Promise<undefined>
抛出错误会变成 Promise 的 reject
在 async 函数中使用 throw,等同于 return Promise.reject(...)。调用方可以用 .catch() 或 try...catch 捕获。
-
async function fail() { throw new Error("oops"); }→ 返回被 reject 的 Promise - 这和
return Promise.reject(new Error("oops"))行为一致
await 会解包 Promise,但不影响函数本身的返回机制
await 只是让异步等待更简洁,它不会改变 async 函数的返回规则。你 await 一个 Promise,得到的是它的值,再 return 这个值,最终仍会被包进新的 Promise。
立即学习“Java免费学习笔记(深入)”;
async function wrap() { const data = await fetch("/api").then(r => r.json()); return data; }- 即使
data是普通对象,wrap()仍返回Promise<typeof data>
不建议手动 Promise.resolve 包装返回值
这是常见误区:有人习惯写 return Promise.resolve(x),其实多余且可能掩盖问题。
- 如果
x已是 Promise,Promise.resolve(x)会原样返回它(不扁平化) - 而 async 函数天然支持 Promise 扁平化(即自动展开嵌套 Promise)
- 比如
async function f() { return Promise.resolve(Promise.resolve(123)); }→ 最终 resolve 得到123,不是 Promise
所以,只需自然 return,其余交给引擎处理。不复杂但容易忽略。


















