promise有哪几种状态?是如何变化的?

在前端开发中,Promise 有三种状态:

  • pending (等待): Promise 初始化时的状态。既没有被 fulfilled (成功),也没有被 rejected (失败)。 在这个状态下,Promise 的 then 方法和 catch 方法都不会被执行。

  • fulfilled (已完成): Promise 的异步操作成功完成后的状态。这时,then 方法中的回调函数会被执行,并将异步操作的结果作为参数传递给回调函数。

  • rejected (已拒绝): Promise 的异步操作失败后的状态。这时,catch 方法中的回调函数会被执行,并将异步操作的错误原因作为参数传递给回调函数。

状态变化:

Promise 的状态只能从 pending 变为 fulfilled 或 rejected,一旦状态变为 fulfilled 或 rejected,就永远不会再改变。 这保证了 Promise 的结果的确定性和一致性。 这被称为状态机。 状态转换图如下:

pending  ---------> fulfilled
       |
       ---------> rejected

状态变化的触发:

  • resolve() 方法: 当异步操作成功完成时,调用 resolve() 方法,将 Promise 的状态变为 fulfilled,并将结果作为参数传递给 then 方法的回调函数。

  • reject() 方法: 当异步操作失败时,调用 reject() 方法,将 Promise 的状态变为 rejected,并将错误原因作为参数传递给 catch 方法的回调函数。

示例 (JavaScript):

const myPromise = new Promise((resolve, reject) => {
  // 模拟一个异步操作
  setTimeout(() => {
    const success = Math.random() < 0.5; // 50% 的概率成功
    if (success) {
      resolve("操作成功!"); // 状态变为 fulfilled
    } else {
      reject("操作失败!"); // 状态变为 rejected
    }
  }, 1000);
});

myPromise
  .then(result => {
    console.log(result); // 输出 "操作成功!" 或抛出错误
  })
  .catch(error => {
    console.error(error); // 输出 "操作失败!"
  });

在这个例子中,setTimeout 模拟了一个异步操作。 1 秒后,随机决定是调用 resolve() 还是 reject(),从而改变 Promise 的状态。 then 方法处理成功的情况,catch 方法处理失败的情况。 Promise 的状态变化是单向的,不可逆的。

总而言之,理解 Promise 的三种状态及其单向转换是掌握 Promise 的关键。 这使得你可以编写更清晰、更易于维护的异步 JavaScript 代码。

posted @ 2024-12-14 09:11  王铁柱6  阅读(219)  评论(0)    收藏  举报