promise有三种状态:pending、fulfilled和rejected,初始为pending,通过resolve或reject改变状态,且一旦改变不可逆;调用resolve(value)进入fulfilled状态,触发.then()第一个回调,调用reject(reason)进入rejected状态,触发.catch()或.then()第二个回调;多次调用resolve或reject只有第一次有效;在链式调用中,.then()或.catch()返回值决定新Promise的状态:返回普通值则新Promise为fulfilled,抛出异常则为rejected,返回Promise则继承其状态。

Promise 是 javaScript 中处理异步操作的核心机制之一,理解它的状态变化对掌握异步编程至关重要。Promise 本身有三种状态:等待(pending)、成功(fulfilled)和失败(rejected)。一旦状态发生改变,就不会再变,且这个过程是不可逆的。
Promise 的三种状态
每一个 Promise 实例在生命周期中只能处于以下三种状态之一:
- pending(等待):初始状态,既没有被完成,也没有被拒绝。Promise 刚创建时默认处于这个状态。
- fulfilled(成功):表示异步操作成功完成。此时会调用 .then() 中的第一个回调函数。
- rejected(失败):表示异步操作失败。此时会调用 .then() 的第二个回调或 .catch() 中的回调。
重要的是,Promise 的状态一旦从 pending 变为 fulfilled 或 rejected,就不会再发生变化,这个特性称为“状态的凝固性”。
状态是如何改变的?
Promise 状态的改变由执行器函数(executor)中的 resolve 和 reject 函数触发:
new Promise((resolve, reject) => {
// 初始状态:pending
if (/* 操作成功 */) {
resolve(value); // 变为 fulfilled
} else {
reject(reason); // 变为 rejected
}
});
调用 resolve(value) 会将 Promise 状态设为 fulfilled,并将 value 传递给后续的 .then() 回调;调用 reject(reason) 会将其设为 rejected,reason 通常是一个错误对象。
状态变化的不可逆性
无论你在 executor 中调用多少次 resolve 或 reject,只有第一次有效:
new Promise((resolve, reject) => {
resolve(‘ok’);
reject(new Error(‘fail’)); // 不起作用
resolve(‘another’); // 不起作用
});
上面的例子中,Promise 一旦 resolve(‘ok’) 被调用,状态立即变为 fulfilled,后续的 reject 和 resolve 都会被忽略。
链式调用中的状态传递
在 .then() 或 .catch() 中返回值,会生成一个新的 Promise,其状态取决于回调的返回结果:
- 如果返回一个普通值,新的 Promise 变为 fulfilled。
- 如果抛出异常,新的 Promise 变为 rejected。
- 如果返回一个 Promise 对象,则新 Promise 的状态由该对象决定。
这意味着你可以通过链式结构精确控制异步流程的状态流转。
基本上就这些。Promise 的状态机制看似简单,但正是这种“单向、不可逆”的设计,让它成为可靠异步处理的基础。理解清楚状态何时改变、如何传递,能避免很多常见的异步陷阱。