返回

从零实现 Promise, 掌握 JavaScript 异步编程利器

前端

正文

作为一名资深的 JavaScript 开发者,掌握异步编程是必备技能。Promise 作为 JavaScript 中处理异步操作的利器,已经成为现代 JavaScript 开发的标准。今天,我们将从零开始实现 Promise,并深入理解 Promise/A+ 规范。同时,你将学会如何使用 async 和 await 来简化异步编程。准备好迎接一场知识盛宴了吗?

Promise 是什么?

Promise 是一个 JavaScript 对象,用于处理异步操作。它可以让你将异步操作的结果传递给后续的代码,从而避免回调函数的嵌套。Promise 有三种状态:pending、fulfilled 和 rejected。pending 表示异步操作正在进行中,fulfilled 表示异步操作成功完成,rejected 表示异步操作失败。

实现 Promise

要实现 Promise,我们需要定义一个构造函数,该构造函数接收一个执行器函数作为参数。执行器函数有两个参数,resolve 和 reject。resolve 用于将异步操作的结果传递给后续的代码,reject 用于将异步操作的错误信息传递给后续的代码。

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

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

    const reject = (error) => {
      if (this.state !== 'pending') {
        return;
      }
      this.state = 'rejected';
      this.result = 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 === 'pending') {
        this.onFulfilledCallbacks.push(() => {
          try {
            const result = onFulfilled(this.result);
            resolve(result);
          } catch (error) {
            reject(error);
          }
        });
        this.onRejectedCallbacks.push(() => {
          try {
            const result = onRejected(this.result);
            resolve(result);
          } catch (error) {
            reject(error);
          }
        });
      } else if (this.state === 'fulfilled') {
        try {
          const result = onFulfilled(this.result);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      } else if (this.state === 'rejected') {
        try {
          const result = onRejected(this.result);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      }
    });
  }
}

测试是否符合 Promise/A+ 规范

为了确保我们的 Promise 实现符合 Promise/A+ 规范,我们可以使用一个专门的测试套件来进行测试。Promise/A+ 规范定义了 Promise 的一系列行为,这些行为可以通过测试来验证。

如何实现 async 和 await

async 和 await 是 ES8 中引入的两个,用于简化异步编程。async 函数是一个返回 Promise 的函数,await 关键字用于等待 Promise 的结果。使用 async 和 await,可以使异步编程代码看起来更加同步。

async function myAsyncFunction() {
  const result = await Promise.resolve(1);
  console.log(result); // 1
}

myAsyncFunction();

结语

通过本文,你已经了解了 Promise 的概念、实现原理、使用场景,以及如何实现 async 和 await。现在,你已经掌握了 JavaScript 异步编程的利器,可以轻松应对各种异步编程场景。快去实践一下,体验 Promise 的强大之处吧!