Promise状态只能从pending变为fulfilled或rejected且不可逆;resolve使Promise变为fulfilled并传递值,reject使其变为rejected并传递错误;executor同步执行,但then/catch回调异步进入微任务队列。

Promise 构造函数内部通过调用 resolve 或 reject 函数来改变 Promise 实例的状态。状态一旦改变,就不可逆 —— 也就是说,只能从 pending 变为 fulfilled(成功)或 rejected(失败),且只能触发一次。
resolve 如何让 Promise 进入 fulfilled 状态
resolve 是 Promise 构造函数执行器(executor)的第一个参数,它是一个函数。调用它时,会将 Promise 的状态由 pending 改为 fulfilled,并把传入的值作为后续 .then() 的第一个回调函数的参数。
- 如果传入一个普通值(如字符串、数字、对象),Promise 立即变为 fulfilled,值就是该值
- 如果传入另一个 Promise(比如
resolve(Promise.resolve(42))),当前 Promise 会“跟随”那个 Promise 的最终状态和值(即进入 resolve 链式等待) - 如果在已 fulfilled 或 rejected 的 Promise 上再次调用 resolve,不会有任何效果 —— 状态不会重复改变
reject 如何让 Promise 进入 rejected 状态
reject 是 executor 的第二个参数,也是一个函数。调用它会立即将 Promise 状态设为 rejected,并把传入的参数(通常是 Error 实例或错误信息)作为后续 .catch() 或 .then(null, onRejected) 的参数。
- 推荐传入
new Error('msg'),便于调试时获取堆栈信息 - 即使传入非 Error 类型(如字符串、数字),Promise 仍会进入 rejected 状态,只是缺乏堆栈追踪
- 和 resolve 一样,多次调用 reject 也无效,只有第一次生效
状态变化的关键规则
Promise 的状态转换严格遵循以下原则:
- 初始状态一定是
pending - 只能由
pending → fulfilled或pending → rejected - 状态不可逆、不可重置:fulfilled 不会变回 pending,rejected 也不会变成 fulfilled
- executor 函数是同步执行的,但 resolve/reject 的效果是异步触发 then/catch 回调(它们被放入微任务队列)
常见误区提醒
容易误以为“调用了 resolve 就立刻执行 then”,其实不是:
- resolve 调用后,
.then()回调不会立即运行,而是等当前同步代码执行完,再在下一个微任务中执行 - 构造函数里抛出未捕获错误(如
throw new Error()),等价于自动调用reject - 不调用 resolve 或 reject,Promise 会永远卡在 pending 状态(可能造成内存泄漏或逻辑阻塞)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











