async函数抛出Error实例会立即使返回Promise进入rejected状态,因其本质是Promise语法糖:throw等价于隐式reject(Error),错误实例直接作为reason,符合Promise/A+规范。
async 函数内部一旦抛出 Error 实例,其返回的 Promise 立即进入 rejected 状态,原因在于 JavaScript 引擎对 async 函数的编译与执行机制——它本质是 Promise 状态流转的语法糖封装,而非独立运行时。
当你声明一个 async 函数,V8(或其他引擎)会将其自动包裹进一个隐式 Promise 构造逻辑中:
resolve(value);throw new Error(...) → 等价于立即调用隐式 reject(error),且传入的就是该 Error 实例本身;根据 Promise/A+ 规范和 ECMAScript 标准,async 函数体内的同步异常(包括 throw)会被引擎捕获并映射为 Promise rejection:
你可以把 throw new Error("msg") 在 async 函数里,看作语法上更自然的 return Promise.reject(new Error("msg")):
虽然 throw "oops" 或 throw 42 同样让 Promise rejected,但它们不会自动构造 Error 对象:
new Error(),既符合规范,也利于可观测性。不复杂但容易忽略:async 函数的“错误即 rejection”不是模拟出来的,而是语言层面对 Promise 状态机的原生对接。