返回

程序员视角,Promise 的前世今生

前端

好的,这是关于“手撕 Promise”的文章:

手撕 Promise

在 JavaScript 中,Promise 是一个强大的工具,可以帮助我们处理异步操作。它提供了一种简洁的方式来处理异步操作的结果,并使我们的代码更加容易理解和维护。

如果想深入了解 Promise 的内部实现,最好的方法之一就是自己动手实现它。本文将带领你一步一步地手撕 Promise,从原理到应用,让你全面理解 Promise 的前世今生。

Promise 的三种状态

Promise 有三种状态:

  • 待定(pending):这是 Promise 的初始状态。它表示异步操作尚未完成。
  • 已完成(fulfilled):这是 Promise 的成功状态。它表示异步操作已成功完成,并返回了一个值。
  • 已拒绝(rejected):这是 Promise 的失败状态。它表示异步操作已失败,并返回了一个错误对象。

Promise 的实现

我们可以使用以下代码来实现 Promise:

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

    const resolve = (value) => {
      if (this.state === 'pending') {
        this.state = 'fulfilled';
        this.value = value;
        this.onFulfilledCallbacks.forEach((callback) => {
          callback(value);
        });
      }
    };

    const reject = (error) => {
      if (this.state === 'pending') {
        this.state = 'rejected';
        this.error = error;
        this.onRejectedCallbacks.forEach((callback) => {
          callback(error);
        });
      }
    };

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

  then(onFulfilled, onRejected) {
    return new Promise((resolve, reject) => {
      if (this.state === 'fulfilled') {
        onFulfilled(this.value);
        resolve(this.value);
      } else if (this.state === 'rejected') {
        onRejected(this.error);
        reject(this.error);
      } else {
        this.onFulfilledCallbacks.push(() => {
          onFulfilled(this.value);
          resolve(this.value);
        });
        this.onRejectedCallbacks.push(() => {
          onRejected(this.error);
          reject(this.error);
        });
      }
    });
  }

  catch(onRejected) {
    return this.then(undefined, onRejected);
  }

  finally(onFinally) {
    return this.then(
      (value) => {
        onFinally();
        return value;
      },
      (error) => {
        onFinally();
        throw error;
      }
    );
  }
}

Promise 的应用

Promise 可以用于处理各种异步操作,例如:

  • 网络请求
  • 文件读取
  • 定时器
  • WebSockets

Promise 可以使我们的代码更加容易理解和维护。它可以帮助我们避免回调地狱,并使我们的代码更加结构化。

结语

Promise 是 JavaScript 中一个非常强大的工具,可以帮助我们处理异步操作。它可以使我们的代码更加容易理解和维护。如果你想在 JavaScript 中进行异步编程,那么 Promise 是你必不可少的一项工具。