手写Promise

261 阅读1分钟

以下是实现的Promise的简单版本

class MyPromise {
  constructor(executor) {
    this.state = 'pending';
    this.value = '';
    this.resolveCallBacks = [];
    this.rejectCallbacks = [];
    const resolve = (value) => {
      if (this.state === 'pending') {
        this.state = 'fulfilled';
        this.value = value;
        this.resolveCallBacks.forEach((resolveCb) => {
          resolveCb();
        });
      }
    };
    const reject = (value) => {
      if (this.state === 'pending') {
        this.state = 'rejected';
        this.value = value;
        this.rejectCallbacks.forEach((rejectCb) => {
          rejectCb();
        });
      }
    };
    executor(resolve, reject);
  }
  then(fulfillCb, rejectedCb) {
    if (typeof fulfillCb !== 'function') {
      fulfillCb = () => this.value;
    }
    if (typeof rejectedCb !== 'function') {
      rejectedCb = () => this.value;
    }
    return new MyPromise((resolve, reject) => {
      if (this.state === 'pending') {
        this.resolveCallBacks.push(() => {
          const result = fulfillCb(this.value);
          resolve(result);
        });
        this.rejectCallbacks.push(() => {
          console.log('rejectedCb', rejectedCb);
          const result = rejectedCb(this.value);
          reject(result);
        });
      }
      if (this.state === 'fulfilled') {
        setTimeout(() => {
          const result = fulfillCb(this.value);
          resolve(result);
        }, 0);
      }
      if (this.state === 'rejected') {
        setTimeout(() => {
          const result = rejectedCb(this.value);
          console.log('result', result);
        }, 0);
      }
    });
  }
}
module.exports = MyPromise;