返回

从零基础到高手:揭秘 Promise 源代码,掌握每个 API

前端

前言

万字长文,带你从 0 到 1,手撸 Promise 源码,清除了解每一个常用 API。在本文中,我们将踏上一次代码探险之旅,从头开始构建 Promise 源码,揭秘其内部运作原理。准备好提升你的 JavaScript 编程技能了吗?

Promise 入门

Promise 是 JavaScript 中用于处理异步操作的神奇工具。它允许我们以一种优雅且可控的方式处理异步代码,让我们的程序更加健壮和易于理解。

Promise 的三大状态

每个 Promise 都有三个状态:

  • Pending: 这是 Promise 的初始状态,表示操作尚未完成。
  • Fulfilled: 当操作成功完成时,Promise 进入已完成状态,并带有一个值。
  • Rejected: 当操作失败时,Promise 进入已拒绝状态,并带有一个错误对象。

Promise 的 API

Promise 提供了一系列 API,用于处理不同状态的 Promise:

  • then(): 用于处理已完成的 Promise,并返回一个新的 Promise。
  • catch(): 用于处理已拒绝的 Promise,并返回一个新的 Promise。
  • finally(): 无论 Promise 是完成还是拒绝,都会执行的回调函数。

Promise 源码实现

现在,我们开始构建 Promise 的源代码。为了简化起见,我们将只实现基本功能。

Promise 构造函数

class Promise {
  constructor(executor) {
    this.state = "pending";
    this.value = undefined;
    this.error = undefined;
    this.onFulfilledCallbacks = [];
    this.onRejectedCallbacks = [];

    try {
      executor(this.resolve.bind(this), this.reject.bind(this));
    } catch (error) {
      this.reject(error);
    }
  }
}

resolve() 和 reject() 方法

resolve(value) {
  if (this.state !== "pending") return;

  this.state = "fulfilled";
  this.value = value;
  this.onFulfilledCallbacks.forEach(callback => callback(value));
}

reject(error) {
  if (this.state !== "pending") return;

  this.state = "rejected";
  this.error = error;
  this.onRejectedCallbacks.forEach(callback => callback(error));
}

then() 方法

then(onFulfilled, onRejected) {
  return new Promise((resolve, reject) => {
    if (this.state === "fulfilled") {
      const result = onFulfilled(this.value);

      if (result instanceof Promise) {
        result.then(resolve, reject);
      } else {
        resolve(result);
      }
    } else if (this.state === "rejected") {
      if (onRejected) {
        const result = onRejected(this.error);

        if (result instanceof Promise) {
          result.then(resolve, reject);
        } else {
          resolve(result);
        }
      } else {
        reject(this.error);
      }
    } else {
      this.onFulfilledCallbacks.push(onFulfilled);
      this.onRejectedCallbacks.push(onRejected);
    }
  });
}

结论

我们刚刚从头开始构建了 Promise 源码,了解了它的内部运作原理。通过掌握 Promise 的 API,你将能够编写更加健壮、可控的异步代码。继续探索 JavaScript 的奇妙世界,成为一名更好的开发者!