返回

渐进式解析: Handwritten Promise 实现指南

前端

Promise 的基础

Promise 是 JavaScript 中一个强大的工具,可以帮助我们处理异步操作。它是一种对象,表示一个异步操作的最终完成或失败的结果。Promise 有三种状态:

  • 等待(Pending):表示操作正在进行中。
  • 已完成(Fulfilled):表示操作已成功完成。
  • 已拒绝(Rejected):表示操作已失败。

创建 Promise

我们可以使用 new Promise() 函数来创建一个 Promise 对象。该函数接受一个 executor 函数作为参数,executor 函数有两个参数:resolverejectresolve 函数用于将 Promise 的状态从 Pending 更改为 Fulfilled,而 reject 函数用于将 Promise 的状态从 Pending 更改为 Rejected

const promise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    // 操作成功
    resolve('操作成功');
  }, 1000);
});

使用 Promise

我们可以使用 .then() 方法来处理 Promise 的结果。.then() 方法接受两个函数作为参数:onFulfilledonRejectedonFulfilled 函数用于处理 Promise 成功完成的结果,而 onRejected 函数用于处理 Promise 失败的结果。

promise.then(
  (result) => {
    // 处理操作成功的结果
    console.log(result);
  },
  (error) => {
    // 处理操作失败的结果
    console.error(error);
  }
);

Promise 链式调用

Promise 的一个强大特性是链式调用。我们可以通过 .then() 方法将多个 Promise 连接起来,形成一个链条。当一个 Promise 完成时,它会触发下一个 Promise 的执行。

promise
  .then((result) => {
    // 处理操作成功的结果
    console.log(result);
    return '新的 Promise';
  })
  .then((result) => {
    // 处理第二个 Promise 的结果
    console.log(result);
  })
  .catch((error) => {
    // 处理操作失败的结果
    console.error(error);
  });

Promise.all() 和 Promise.race()

Promise.all() 函数可以将多个 Promise 包装成一个新的 Promise。当所有传入的 Promise 都完成时,新的 Promise 才会完成。Promise.race() 函数也可以将多个 Promise 包装成一个新的 Promise。但是,当第一个传入的 Promise 完成时,新的 Promise 就会完成。

const promises = [
  promise1,
  promise2,
  promise3
];

Promise.all(promises)
  .then((results) => {
    // 处理所有 Promise 完成的结果
    console.log(results);
  })
  .catch((error) => {
    // 处理操作失败的结果
    console.error(error);
  });

Promise.race(promises)
  .then((result) => {
    // 处理第一个 Promise 完成的结果
    console.log(result);
  })
  .catch((error) => {
    // 处理操作失败的结果
    console.error(error);
  });

总结

Promise 是 JavaScript 中一个非常强大的工具,可以帮助我们处理异步操作。它可以使我们的代码更优雅、更易读、更易维护。如果您还没有使用过 Promise,我强烈建议您学习一下。相信您一定会爱上它。