async函数返回值必为Promise,无论return何值均被自动封装为Promise.resolve(value)或直接返回原Promise,嵌套Promise需await解包,调用方必须显式处理Promise才能获取最终值。

async 函数的返回值不是你写的那个值,而是 Promise —— 这是标准化的核心。它不改变你 return 的内容,但统一用 Promise 封装,让所有异步操作对外接口一致。
返回值自动包装成 Promise
无论函数内部 return 什么,都会被规范地转为 Promise:
- return 字符串、数字、对象、undefined → 等价于 Promise.resolve(value)
- return 已存在的 Promise(如 fetch() 或 Promise.resolve(…))→ 直接返回该 Promise,不额外套一层
- throw 错误 或 reject → 返回 Promise.reject(error)
嵌套 Promise 不会自动解包
async 函数只展平“直接 return”的那一层 Promise,不会递归处理内部 resolve 出来的 Promise:
- 错误示例:
return Promise.resolve(Promise.resolve(42))→ 最终 resolve 值是 Promise {42},不是 42 - 正确做法:在 return 前 await 一次,确保拿到最终值:
const x = await Promise.resolve(42); return x * 2; - 或避免在 .then() 中返回新 Promise:
return p.then(v => v * 2)(返回的是 Promise,不是 Promise >)
调用方必须主动消费 Promise
async 函数本身不输出、不赋值、不打印 —— 它只返回 Promise。要拿到结果,必须显式处理:
立即学习“Java免费学习笔记(深入)”;
- 在 async 函数内:await fn() 得到解包后的值
- 在普通函数或顶层(ESM 模块):fn().then(console.log) 或 const res = await fn()
- 忘记处理会导致“看似没反应”:比如 IIFE 中
return result却没 console.log,结果就丢失了
检查是否意外返回嵌套 Promise
调试时可快速验证返回结构:
- 打印
res.constructor === Promise:若为 true,说明 res 仍是 Promise,不是原始值 - 尝试双重 await:
const inner = await fn(); const actual = await inner;—— 如果 second await 才有值,说明第一层返回的是嵌套 Promise - 更可靠的做法:所有异步调用都加 await,return 平坦值(字符串/对象/数组等),不 return 未 await 的 Promise


















