返回

Promise.prototype.then方法源码剖析

前端

Promise.prototype.then方法简介

Promise.prototype.then方法是Promise对象的一个实例方法,用于指定在Promise对象的状态改变后要执行的回调函数。它接收两个参数:onFulfilled和onRejected。onFulfilled是Promise对象状态变为fulfilled时要执行的回调函数,onRejected是Promise对象状态变为rejected时要执行的回调函数。

Promise.prototype.then方法源码剖析

then(onFulfilled, onRejected) {
  const result = new Promise((resolve, reject) => {
    const fulfillPromise = (value) => {
      if (typeof onFulfilled === 'function') {
        try {
          const x = onFulfilled(value);
          resolvePromise(promise2, x, resolve, reject);
        } catch (err) {
          reject(err);
        }
      } else {
        resolve(value);
      }
    };

    const rejectPromise = (reason) => {
      if (typeof onRejected === 'function') {
        try {
          const x = onRejected(reason);
          resolvePromise(promise2, x, resolve, reject);
        } catch (err) {
          reject(err);
        }
      } else {
        reject(reason);
      }
    };

    this.done(fulfillPromise, rejectPromise);
  });

  return result;
}

源码解析

  1. 首先,then方法返回一个新的Promise对象,这个新的Promise对象的状态取决于onFulfilled和onRejected回调函数的执行结果。
  2. 在新的Promise对象内部,首先定义了两个回调函数:fulfillPromise和rejectPromise。
  3. fulfillPromise回调函数用于处理Promise对象状态变为fulfilled时的逻辑。如果onFulfilled回调函数是一个函数,则执行该函数,并把Promise对象的状态变为fulfilled。如果onFulfilled回调函数不是一个函数,则直接把Promise对象的状态变为fulfilled。
  4. rejectPromise回调函数用于处理Promise对象状态变为rejected时的逻辑。如果onRejected回调函数是一个函数,则执行该函数,并把Promise对象的状态变为rejected。如果onRejected回调函数不是一个函数,则直接把Promise对象的状态变为rejected。
  5. 然后,调用this.done方法,传递fulfillPromise和rejectPromise回调函数作为参数。this.done方法是Promise对象的另一个实例方法,用于指定当Promise对象的状态改变后要执行的回调函数。
  6. 最后,返回新的Promise对象。

Promise.prototype.then方法的使用示例

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Hello, world!');
  }, 1000);
});

promise.then((result) => {
  console.log(result); // Hello, world!
});

在这个示例中,我们首先创建一个Promise对象,并指定了一个setTimeout函数作为其执行器。setTimeout函数在1秒后调用resolve函数,并将'Hello, world!'作为参数传递给resolve函数。

然后,我们调用Promise对象的then方法,并传递一个回调函数作为参数。这个回调函数会在Promise对象的状态变为fulfilled时执行。在回调函数中,我们使用console.log()函数打印Promise对象的状态。

1秒后,setTimeout函数执行,resolve函数被调用,Promise对象的状态变为fulfilled。此时,then方法指定的回调函数被执行,并将'Hello, world!'打印到控制台。

Promise.prototype.then方法的注意事项

在使用Promise.prototype.then方法时,需要注意以下几点:

  • then方法总是返回一个新的Promise对象。
  • then方法可以多次调用,每次调用都会返回一个新的Promise对象。
  • then方法的回调函数可以是同步的或异步的。
  • then方法的回调函数可以返回一个值或另一个Promise对象。
  • then方法的回调函数如果抛出错误,则会使新的Promise对象的状态变为rejected。