async函数永远返回promise,其状态由return值或throw行为决定,返回值自动promise化,内部promise会被解包同步状态,未捕获错误直接触发reject,await仅暂停执行不影响返回类型。

async 函数永远返回一个 Promise,这不是约定,而是 JavaScript 引擎强制执行的规范行为。它的“状态受控”体现在:这个 Promise 的最终状态(fulfilled 或 rejected)完全由函数体内的 return 值或 throw 行为决定,且整个过程由运行时自动调度微任务完成同步。
返回值自动 Promise 化
无论你 return 什么,引擎都会把它包进 Promise.resolve():
- return 42 → 等价于 Promise.resolve(42)
- return "ok" → 等价于 Promise.resolve("ok")
- 不写 return → 等价于 Promise.resolve(undefined)
这层包装是隐式的、不可跳过的,所以调用 async 函数后,你拿到的一定是一个 Promise 实例,不是原始值,也不是其他类型的对象。
内部 Promise 会被解包并同步状态
当你 return 一个已存在的 Promise(比如 return fetch(...)),async 不会再套一层 Promise,而是“解开它”,让外层 Promise 的状态与它保持一致:
- 内部 Promise 成功 → 外层 Promise 也成功,值相同
- 内部 Promise 失败 → 外层 Promise 也失败,错误相同
- 这个同步过程必须通过 .then() 注册微任务来完成,因此总会比同步代码晚一步执行
错误路径直接触发 reject
async 函数内任何未捕获的 throw,都会让返回的 Promise 进入 rejected 状态:
- throw new Error('boom') → 等价于 Promise.reject(new Error('boom'))
- try/catch 捕获后不 re-throw,就不会 reject;但只要抛出,Promise 就确定失败
- 这意味着你不需要手动写 Promise.reject(),引擎已为你接管了所有错误出口
await 不改变返回类型,只暂停执行流
await 只影响函数体内语句的执行顺序,不影响函数本身的返回类型:
- 有 await 的 async 函数 → 返回 Promise
- 没 await 的 async 函数 → 同样返回 Promise(只是立即 resolve)
- await 只是告诉引擎:“等这个 Promise settle 后再继续”,而 return 才真正决定外层 Promise 的终态











