promise构造函数的executor同步执行,其中任何同步抛出的错误都会被自动捕获并使该promise立即进入rejected状态,等价于调用reject(error),但异步错误不会被捕获。

会。Promise 构造函数的执行器(executor)中,任何同步抛出的错误都会被自动捕获,并导致该 Promise 立即进入 rejected 状态,等价于调用了 reject(error)。
为什么说“自动转为 reject”
执行器函数是同步运行的。一旦其中出现未捕获的异常(比如 undefined.xxx、throw new Error()、访问不存在的属性或方法),Promise 内部机制会拦截这个错误,不再让它冒泡到全局,而是用它作为拒绝理由,把当前 Promise 的状态从 pending 变为 rejected。
这和你手动写 reject(new Error(...)) 效果一致,但无需显式调用。
-
示例:
new Promise(() => { throw 'oops' })→ 等价于new Promise((_, reject) => reject('oops')) -
注意:这个自动转换只发生在 executor 函数体内(即
new Promise(fn)的fn中),不包括then或catch回调里——那些回调里的错误也会被自动 reject,但属于链式处理逻辑,不是构造阶段的“自动转换”。
哪些错误会被自动转为 reject
仅限 executor 中的同步错误:
-
throw语句(无论值类型) - 运行时异常:如
null.toString()、undefined.x、JSON.parse('invalid') - 语法错误不会触发(因为代码根本无法执行到那里)
异步代码中的错误(如 setTimeout(() => { throw ... }))不会被捕获,会变成未捕获异常,走 window.onerror,而不是 Promise reject。
和 then/catch 中的错误处理区别
then 回调里抛错,也会导致返回的新 Promise 被 reject,但这属于 Promise 链的错误传播规则,不是“构造器自动转换”。关键区别在于:
- 构造器内错误 → 当前 Promise 立即 reject
-
then内错误 → 当前then返回的 新 Promise 被 reject,原 Promise 已完成
所以,一个 Promise 实例的状态改变只有一次,且只由 executor 决定初始结果;后续链上的错误影响的是新生成的 Promise。











