async函数的执行本质是Promise状态机自动化管理:正常返回隐式resolve,抛出Error实例则会同步将Promise状态从pending设为rejected,Error对象直接作为拒绝理由,整个过程无异步延迟,与显式调用Promise.reject()等效,且推荐使用Error对象以保留堆栈信息。
async function 时,V8(或其他引擎)并不是把它当成一个独立函数来运行,而是自动套进了一个隐式的 Promise 构造器里。具体来说:
return value → 对应隐式的 resolve(value)。throw new Error(...) → 对应隐式的 reject(error),而且拿到的就是这个 Error 实例本身。throw new Error("msg") 在 async 函数里,看作是语法上更自然的 return Promise.reject(new Error("msg"))。两者最终都会导致同一个 Promise 被 rejected,reason 完全相同。唯一区别是书写风格:throw 是同步异常语句,reject 是显式 Promise 操作。但底层触发的状态变更路径、时机和数据结构,完全一致。
throw "oops" 或 throw 42 同样能让 Promise 变 rejected,但不会自动构造 Error 对象。也就是说,reason 就是一个字符串或数字,没有 stack trace。这在日志、监控、开发者工具里根本没法定位问题源头。所以,统一使用 new Error() 是最稳妥的做法——既符合规范,也利于可观测性。
不复杂,但容易忽略:async 函数的“错误即 rejection”不是模拟出来的,是语言层面对 Promise 状态机的原生对接。 你写的每一个 throw,引擎都会认真对待,并且绝不给你留后悔的机会。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述