promise 的 executor 函数在创建时立即同步执行,resolve/reject 需显式调用才触发状态变更,二者不可逆且先到者胜;抛出异常等价于自动 reject。

Promise 内部的 resolve 和 reject 是由你传入构造函数的执行器(executor)函数主动调用的,不是自动触发的——它们本质是两个由 JavaScript 引擎提供的回调函数,只在 executor 里被你显式调用时才生效。
resolve 和 reject 的触发前提是 executor 执行
new Promise 一创建,executor 就立即同步执行。它接收 resolve 和 reject 两个参数,你必须在其中某个分支里调用其中一个(或都不调用,但 Promise 会一直 pending):
- 调用 resolve(value) → Promise 状态从 pending 变为 fulfilled,并把 value 作为成功结果传递给后续 .then 的第一个回调
- 调用 reject(reason) → Promise 状态从 pending 变为 rejected,并把 reason 作为错误原因传递给 .catch 或 .then 的第二个回调
- 如果 executor 内部抛出未捕获异常(比如 throw new Error()),等价于自动调用 reject,无需手动写 reject
触发后状态不可逆,先到者胜
Promise 状态一旦改变(fulfilled 或 rejected),就再也不能被修改。所以:
- 如果 resolve 和 reject 在 executor 中都写了,且没有条件控制,先执行的那个生效,后执行的被忽略
- 如果它们依赖异步操作(如 setTimeout、fetch),谁先完成、先调用,谁就决定最终状态
- 例如:setTimeout(() => resolve(), 100) 和 setTimeout(() => reject(), 50),最终是 reject 生效
静态方法 Promise.resolve / Promise.reject 本质是快捷触发
它们不是“内部触发”,而是直接创建已确定状态的 Promise 实例:
- Promise.resolve(x) 相当于 new Promise(r => r(x)) —— 立即触发 resolve,返回 fulfilled 状态的 Promise
- Promise.reject(e) 相当于 new Promise((_, rj) => rj(e)) —— 立即触发 reject,返回 rejected 状态的 Promise
- 它们常用于统一包装值或提前终止链式调用,比如 Promise.resolve(42).then(...) 或 Promise.reject(new Error()).catch(...)
常见误点:不是“自动检测成功/失败”
resolve 和 reject 不会根据 return 值、函数是否有 error 或是否 await 完来自动判断。你必须明确调用:
- return 一个值 ≠ 触发 resolve;它只是函数返回值,对 Promise 状态无影响
- await 一个 Promise ≠ 自动 resolve;它只是等待那个 Promise settle 后取值,仍需你在 executor 里手动 resolve
- 只有在 executor 函数体内显式调用 resolve 或 reject(或抛出异常),才真正触发状态变更











