promise简单实现

const PENDING = 'pending';
const FULLFILLED = 'fullfilled';
const REJECTED = 'rejected';

function Mypromise(fn) {
  const self = this;
  this.state = PENDING;
  this.value = null;
  this.reason = null;
  this.resolveCb = [];
  this.rejectedCb = [];

  let resolve = function (value) {
    self.state = FULLFILLED;
    self.value = value;
    self.resolveCb.forEach(handler => {
      handler(value);
    });
  };

  let rejected = function (reason) {
    self.state = REJECTED;
    self.reason = reason;
    self.rejectedCb.forEach(handler => {
      handler(reason);
    });
  };

  try {
    fn(resolve, rejected);
  } catch (err) {
    rejected(err);
  }
}

Mypromise.prototype.then = function (onFullfilled, onRejected) {
  onFullfilled = typeof onFullfilled === 'function' ? onFullfilled : () => { };
  onRejected = typeof onRejected === 'function' ? onRejected : () => { };

  if (this.state === FULLFILLED) {
    return new Mypromise((resolve, rejected) => {
      if (this.value instanceof Mypromise) {
        this.value.then(onFullfilled, onRejected);
      } else {
        try {
          resolve(onFullfilled(this.value));
        } catch (err) {
          rejected(err);
        }
      }
    })
  }

  if (this.state === REJECTED) {
    return new Mypromise((resolve, rejected) => {
      try {
        resolve(onRejected(this.reason));
      } catch (err) {
        rejected(err);
      }
    })
  }

  if (this.state === PENDING) {
    return new Mypromise((resolve, rejected) => {
      this.resolveCb.push(() => {
        if (this.value instanceof Mypromise) {
          this.value.then(onFullfilled, onRejected);
        } else {
          try {
            resolve(onFullfilled(this.value));
          } catch (err) {
            rejected(err);
          }
        }
      });

      this.rejectedCb.push(() => {
        try {
          resolve(onRejected(this.reason));
        } catch (err) {
          rejected(err);
        }
      });
    });
  }
}

new Mypromise((resolve, rejected) => {
  console.log('1');
  resolve('成功');
  console.log('2');
}).then(val => {
  console.log(val);
  return '哈哈哈';
}).then(val => {
  console.log(val);
});