返回

关于手写Promise的深入剖析

前端

**## **

在这篇技术专栏中,我们将探讨手写Promise的复杂过程。对于那些不熟悉Promise的人来说,它们是一种用于异步编程的强大工具,允许开发人员处理不确定和延迟的任务。

**### **

撰写Promise需要对异步编程和Promise A+规范有深入的理解。本文的目的是提供一个全面的指南,帮助开发人员掌握手写Promise的精髓。

**### **

手写Promise遵循以下核心原则:

  • 状态: 每个Promise都有三个可能的状态之一:已决、未决或已拒。
  • 事件: 一旦Promise状态改变,就会触发相应的事件,如"resolved"或"rejected"。
  • 回调: 通过提供回调函数,开发人员可以指定在Promise状态改变时要执行的操作。

**### **

步骤1:构造函数

function Promise(executor) {
  this.state = 'pending';
  this.result = undefined;
  this.onResolveCallbacks = [];
  this.onRejectCallbacks = [];

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

  const reject = (error) => {
    setTimeout(() => {
      if (this.state !== 'pending') return;
      this.state = 'rejected';
      this.result = error;
      this.onRejectCallbacks.forEach((callback) => callback(error));
    });
  };

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

步骤2:then()方法

Promise.prototype.then = function(onResolve, onReject) {
  return new Promise((resolve, reject) => {
    this.onResolveCallbacks.push((result) => {
      try {
        const resolvedValue = onResolve(result);
        resolve(resolvedValue);
      } catch (error) {
        reject(error);
      }
    });

    this.onRejectCallbacks.push((error) => {
      try {
        const rejectedValue = onReject(error);
        resolve(rejectedValue);
      } catch (error) {
        reject(error);
      }
    });
  });
};

步骤3:catch()方法

Promise.prototype.catch = function(onReject) {
  return this.then(null, onReject);
};

**### **