推荐答案
Promise 共有三种状态:
- pending(等待中):初始状态,表示异步操作尚未完成。
- fulfilled(已完成):表示异步操作成功完成,并且通常会携带一个结果值。
- rejected(已拒绝):表示异步操作失败,并且通常会携带一个失败原因。
状态转换关系如下:
- pending -> fulfilled:当异步操作成功时,Promise 的状态会从
pending变为fulfilled,并传递成功的结果值。 - pending -> rejected:当异步操作失败时,Promise 的状态会从
pending变为rejected,并传递失败的原因。
状态一旦发生改变(从 pending 变为 fulfilled 或 rejected),就不可逆转。这意味着 fulfilled 状态不能再变为 rejected,反之亦然。
本题详细解读
Promise 状态的意义
Promise 的状态管理是其核心机制,它抽象了异步操作的完成情况,使得我们可以更方便地处理异步流程。
- pending:表示异步操作正在进行,我们无法立即获取操作结果,需要等待。
- fulfilled:表示异步操作已经成功完成,并且可以访问到成功的结果值。这通常意味着我们可以继续执行依赖于该结果的操作。
- rejected:表示异步操作失败,并且可以访问到失败的原因。这通常意味着我们需要处理错误或执行错误处理逻辑。
状态转换的触发时机
- 从 pending 到 fulfilled:通常发生在异步操作成功完成后,开发者会调用 Promise 的
resolve()方法,并将成功的结果值作为参数传递给它。 - 从 pending 到 rejected:通常发生在异步操作失败后,开发者会调用 Promise 的
reject()方法,并将失败的原因作为参数传递给它。
状态不可逆转的意义
Promise 状态一旦改变就不可逆转的设计保证了异步操作结果的一致性和可靠性。这意味着:
- 一个 Promise 对象的结果只能被确定一次,要么成功,要么失败。
- 避免了异步操作结果多次变化导致逻辑混乱的问题。
- 确保了
then()和catch()方法的处理逻辑的唯一性。
代码示例
// www.javascriptcn.com code example
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
const success = Math.random() > 0.5;
if (success) {
resolve("Operation successful!"); // 将状态改为 fulfilled
} else {
reject("Operation failed!"); // 将状态改为 rejected
}
}, 1000);
});
myPromise
.then((result) => {
console.log("Fulfilled:", result);
})
.catch((error) => {
console.error("Rejected:", error);
});在这个例子中:
myPromise创建时,初始状态为pending。- 一秒钟后,
resolve()或reject()其中之一被调用。 - 如果
resolve()被调用,Promise 状态变为fulfilled,并执行then()方法的回调函数。 - 如果
reject()被调用,Promise 状态变为rejected,并执行catch()方法的回调函数。 - 无论哪个回调函数被执行,Promise 的状态都不会再改变。