返回

Promise(2):从零开始构建Promise

前端

前言

在现代的JavaScript开发中,异步编程是一个必不可少的技能。Promise作为一种异步编程的解决方案,因其易于使用、可读性高和可组合性强等优点,被广泛应用于各种场景中。

Promise是什么?

Promise是一个表示异步操作的最终完成或失败的对象。它提供了一个简单的接口,允许我们对异步操作的结果进行处理。Promise有三种状态:

  • Pending :初始状态,表示异步操作尚未完成。
  • Fulfilled :成功状态,表示异步操作已完成并且成功。
  • Rejected :失败状态,表示异步操作已完成但失败。

Promise的构造函数

Promise的构造函数接受一个函数作为参数,该函数有两个参数:

  • resolve :当异步操作成功时调用的函数,并将结果作为参数传递。
  • reject :当异步操作失败时调用的函数,并将错误原因作为参数传递。

在构造函数内部,我们可以将异步操作封装在一个try-catch块中,并在try块中调用resolve函数,在catch块中调用reject函数。

function Promise(executor) {
  this.state = 'pending';
  this.value = undefined;
  this.reason = undefined;
  this.onFulfilledCallbacks = [];
  this.onRejectedCallbacks = [];

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

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

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

Promise的实例方法

Promise实例提供了一些方法,包括:

  • then :用于添加回调函数,当Promise状态改变时执行。
  • catch :用于添加回调函数,当Promise状态变为rejected时执行。
  • finally :无论Promise状态如何,都会执行的回调函数。
promise.then((value) => {
  // 处理成功的结果
}, (reason) => {
  // 处理失败的原因
});

promise.catch((reason) => {
  // 处理失败的原因
});

promise.finally(() => {
  // 无论Promise状态如何,都会执行的回调函数
});

Promise的静态方法

Promise还提供了一些静态方法,包括:

  • resolve :创建一个resolved的Promise对象。
  • reject :创建一个rejected的Promise对象。
  • all :将多个Promise对象组合在一起,当所有Promise对象都resolved时,返回一个resolved的Promise对象,否则返回一个rejected的Promise对象。
  • race :将多个Promise对象组合在一起,当其中一个Promise对象resolved或rejected时,返回该Promise对象,否则返回一个pending的Promise对象。
Promise.resolve(value).then((value) => {
  // 处理成功的结果
});

Promise.reject(reason).catch((reason) => {
  // 处理失败的原因
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  // 处理所有Promise对象成功的结果
}, (reason) => {
  // 处理任何一个Promise对象失败的原因
});

Promise.race([promise1, promise2, promise3]).then((value) => {
  // 处理第一个Promise对象成功或失败的结果
});

结语

Promise是一个功能强大的异步编程工具,它可以帮助我们轻松地管理异步操作,避免回调地狱,并使代码更加可读和可维护。

在本文中,我们从头开始构建了一个Promise类库,该类库符合Promise/A+规范,可以实现异步操作的队列化和按序执行,并能返回预期的结果。

希望本文对您有所帮助。如果您有任何问题,请随时与我联系。