手写Promise第三课:then函数和执行队列

93 阅读1分钟

Promise的.then方法

.then方法在Promise对象上定义,它允许我们为Promise的成功(fulfilled)和失败(rejected)状态分别指定回调函数。这些回调函数并不是立即执行的,而是被放入了微任务队列中,等待当前执行栈清空后,按照特定的时机执行。

微任务队列的时机

微任务队列的时机与Promise的状态密切相关。如果Promise的状态是pending,那么.then方法中的回调函数将不会被立即执行,而是等待Promise的状态变为fulfilled或rejected。一旦状态改变,相应的回调函数就会被放入微任务队列中,等待执行。

代码实现

在实现MyPromise类时,我们定义了_pushHandler方法,它负责将回调函数和它们的状态(fulfilled或rejected)一起放入处理队列中。这样,当Promise的状态改变时,我们可以遍历这个队列,执行相应的回调函数。

class MyPromise {
  constructor(executor) {
    this._state = PENDING; // 状态
    this._value = undefined; // 数据
    this._handlers = []; // 处理函数形成的队列
    try {
      executor(this._resolve.bind(this), this._reject.bind(this));
    } catch (error) {
      this._reject(error);
      console.error(error);
    }
  }

  _pushHandler(executor, state, resolve, reject) {
    this._handlers.push({
      executor,
      state,
      resolve,
      reject,
    });
  }

  then(onFulfilled, onRejected) {
    return new MyPromise((resolve, reject) => {
      this._pushHandler(onFulfilled, FULFILLED, resolve, reject);
      this._pushHandler(onRejected, REJECTED, resolve, reject);
    });
  }
}

总结

通过深入理解Promise的.then方法和微任务队列的执行时机,我们可以更好地掌握异步编程的精髓。在实际开发中,合理使用Promise可以让我们写出更加清晰、易于维护的代码。