返回

Promises/A+的精髓:异步编程利器,揭秘Promise实现核心

前端

探索Promises/A+规范的核心概念

Promise:

Promise是一个JavaScript对象,表示一个异步操作的最终完成或失败及其结果。Promise实例具有三种状态:等待(pending)、已完成(fulfilled)和已拒绝(rejected)。

let promise = new Promise((resolve, reject) => {
  // 异步操作...
  if (success) {
    resolve(result);
  } else {
    reject(reason);
  }
});

then方法:

then方法是Promise实例上的一个方法,用于指定在Promise状态改变时要执行的操作。then方法接受两个参数,第一个参数是resolved回调函数,第二个参数是rejected回调函数。

promise.then((result) => {
  // Promise已完成时的处理
}, (reason) => {
  // Promise已拒绝时的处理
});

揭秘Promise实现原理和主要概念

  1. Promise构造函数:
function Promise(executor) {
  this.state = 'pending';
  this.result = undefined;
  this.onFulfilledCallbacks = [];
  this.onRejectedCallbacks = [];

  const resolve = (result) => {
    // 将Promise状态从等待变为已完成
    this.state = 'fulfilled';
    // 将结果保存在result属性中
    this.result = result;
    // 执行所有的resolved回调函数
    this.onFulfilledCallbacks.forEach(callback => callback(result));
  };

  const reject = (reason) => {
    // 将Promise状态从等待变为已拒绝
    this.state = 'rejected';
    // 将原因保存在result属性中
    this.result = reason;
    // 执行所有的rejected回调函数
    this.onRejectedCallbacks.forEach(callback => callback(reason));
  };

  // 立即执行executor函数
  executor(resolve, reject);
}
  1. then方法:
Promise.prototype.then = function(onFulfilled, onRejected) {
  // 返回一个新的Promise对象
  return new Promise((resolve, reject) => {
    // 如果Promise状态为已完成,则立即执行resolved回调函数
    if (this.state === 'fulfilled') {
      setTimeout(() => {
        try {
          // 调用resolved回调函数并获取结果
          const result = onFulfilled(this.result);
          // 将结果传递给新Promise的resolve函数
          resolve(result);
        } catch (error) {
          // 如果resolved回调函数抛出错误,则将错误传递给新Promise的reject函数
          reject(error);
        }
      }, 0);
    }

    // 如果Promise状态为已拒绝,则立即执行rejected回调函数
    else if (this.state === 'rejected') {
      setTimeout(() => {
        try {
          // 调用rejected回调函数并获取结果
          const result = onRejected(this.result);
          // 将结果传递给新Promise的resolve函数
          resolve(result);
        } catch (error) {
          // 如果rejected回调函数抛出错误,则将错误传递给新Promise的reject函数
          reject(error);
        }
      }, 0);
    }

    // 如果Promise状态为等待,则将resolved回调函数和rejected回调函数添加到回调函数数组中
    else {
      this.onFulfilledCallbacks.push(onFulfilled);
      this.onRejectedCallbacks.push(onRejected);
    }
  });
};

探索then方法的异步链式调用的实现方式

promise.then((result) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(result + 1);
    }, 1000);
  });
}).then((result) => {
  console.log(result); // 输出 6
});

Promise提供了then方法,允许我们对Promise进行链式调用。在上面的代码中,第一个then方法返回一个新的Promise,而第二个then方法接收这个新的Promise并将其结果打印到控制台。由于Promise是异步的,因此第一个then方法中的setTimeout函数被延迟执行,而第二个then方法中的console.log函数则立即执行。

梳理Promise裁决过程:从等待到已完成/已拒绝

Promise裁决过程是指将Promise状态从等待变为已完成或已拒绝的过程。裁决过程可以由Promise构造函数中的executor函数触发,也可以由then方法中的resolved回调函数或rejected回调函数触发。

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (success) {
      resolve(result);
    } else {
      reject(reason);
    }
  }, 1000);
});

promise.then((result) => {
  console.log('Promise已完成,结果:', result);
}, (reason) => {
  console.log('Promise已拒绝,原因:', reason);
});

在上面的代码中,Promise构造函数中的executor函数被延迟执行了1秒钟。在执行过程中,如果success为真,则调用resolve函数将Promise状态变为已完成,并将result作为结果传递给then方法中的resolved回调函数。如果success为假,则调用reject函数将Promise状态变为已拒绝,并将reason作为原因传递给then方法中的rejected回调函数。

掌握Promise规范,引领异步编程新时代

Promises/A+规范为JavaScript异步编程提供了统一的标准,使我们能够更轻松地处理异步操作,编写更健壮、更易维护的代码。通过理解Promise实现原理和主要概念、揭秘then方法的异步链式调用的实现方式、梳理Promise裁决过程,我们能够更好地掌握Promises/A+规范,在异步编程的世界中游刃有余。