手写JS(一)--Promise

404 阅读1分钟
const PENDING = 'pending';
const RESOLVED = 'resolved';
const REJECTED = 'rejected';

function MyPromise(constructor) {
  const me = this;
  me.status = PENDING;
  me.value = null;
  me.reason = null;
  me.resolveTasks = [];
  me.rejectTasks = [];
  function resolve(value) {
    if(me.status === PENDING) {
      me.value = value;
      me.status = RESOLVED;
      me.resolveTasks.map(cb => cb(me.value));
    }
  }
  function reject(reason) {
    if(me.status === PENDING) {
      me.reason = reason;
      me.status = REJECTED;
      me.rejectTasks.map(cb => cb(me.reason));
    }
  }
  try {
    constructor(resolve, reject);
  } catch (error) {
    reject(error);
  }
}

MyPromise.prototype.then = function (onFulfilled, onRejected) {
  const me = this;
  onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : v => v;
  onRejected = typeof onRejected === 'function' ? onRejected : e => {
    throw e;
  }

  if(me.status === RESOLVED) {
    onFulfilled(me.value);
  }
  if(me.status === REJECTED) {
    onRejected(me.reason);
  }
  if(me.status === PENDING) {
    me.resolveTasks.push(onFulfilled);
    me.rejectTasks.push(onRejected);
  }
}

MyPromise.all = function(promises) {
  const arr = [];
  return new MyPromise((resolve, reject) => {
    for (let i = 0; i < promises.length; i++) {
      promises[i].then(res => {
        arr[i] = res;
        if(i === promises.length - 1) {
          resolve(arr);
        }
      }, reject)
    }
  })
}