手写 Promise第五课:实现核心的_runOneHandler方法

45 阅读1分钟

Promise是JavaScript中处理异步操作的重要工具。在之前的学习中,我们已经完成了手写Promise的状态管理和处理函数队列的实现。本节课,我们将深入Promise的核心,实现_runOneHandler方法。

1. 判断Promise对象

首先,我们需要一个辅助函数来判断一个数据是否是Promise对象。这通过检查对象是否具有then方法来实现。

function isPromise(obj) {
  return !!(obj && typeof obj === 'object' && typeof obj.then === 'function');
}

2. 实现MyPromise类

接下来,我们定义MyPromise类,并实现其核心方法_runOneHandler

2.1 定义MyPromise类

class MyPromise {
  constructor(executor) {
    this._state = PENDING; // 初始状态为PENDING
    this._value = undefined; // 初始值
    this._handlers = []; // 处理函数队列
    try {
      executor(this._resolve, this._reject);
    } catch (error) {
      this._reject(error);
    }
  }
​
  // 省略其他方法...
}

3. 实现_runOneHandler方法

_runOneHandler方法是处理Promise的核心,它负责执行每个处理函数。

class MyPromise {
  // 省略其他方法...
​
  _runOneHandler({ executor, state, resolve, reject }) {
    runMicroTask(() => {
      if (this._state !== state) {
        // 状态不一致,不处理
        return;
      }
​
      if (typeof executor !== 'function') {
        // 传递后续处理并非一个函数
        this._state === FULFILLED ? resolve(this._value) : reject(this._value);
        return;
      }
      try {
        const result = executor(this._value);
        if (isPromise(result)) {
          result.then(resolve, reject);
        } else {
          resolve(result);
        }
      } catch (error) {
        reject(error);
        console.error(error);
      }
    });
  }
}

4. 总结

通过实现_runOneHandler方法,我们可以更深入地理解Promise的内部机制。这个方法负责根据当前状态执行相应的处理函数,并且能够处理返回值是Promise的情况。