1. 程式人生 > 實用技巧 >es6 promise簡易實現

es6 promise簡易實現

function MyPromise(fn) {
  let _this = this;
  // pending, rejected, resolved
  _this.status = 'pending';
  _this.value = '';
  _this.resolveFnArr = [];
  _this.rejectFnArr = [];
  function resolve (param) {
    if (_this.status === 'pending') {
      _this.status = 'resolved';
      _this.value = param;
      _this.resolveFnArr.length && _this.resolveFnArr.forEach(f => {
        f(_this.value);
      });
    }
  }
  function reject (reason) {
    if (_this.status === 'pending') {
      _this.status = 'rejected';
      _this.value = reason;
      _this.rejectFnArr.length && _this.rejectFnArr.forEach(f => {
        f(_this.value);
      });
    }
  }
  //捕獲構造異常
  try {
    fn(resolve,reject);
  } catch (e) {
    reject(e);
  }
}
MyPromise.prototype.then = function (resolvedFn, rejectedFn) {
  let _this = this;
  let tempPromise = null;
  switch (_this.status) {
    case 'pending': {
      tempPromise = new MyPromise(function (resolve, reject) {
        _this.resolveFnArr.push(function () {
          try {
            let temp = resolvedFn(_this.value);
            resolve(temp);
          } catch (error) {
            reject(error);
          }
        });
      });
      break;
    }
    case 'resolved': {
      tempPromise = new MyPromise(function (resolve, reject) {
        try {
          let temp = resolvedFn(_this.value);
          resolve(temp);
        } catch (error) {
          reject(error);
        }
      });
      break;
    }
    case 'rejected': {
      tempPromise = new MyPromise(function (resolve, reject) {
        try {
          let temp = rejectedFn(_this.value);
          resolve(temp);
        } catch (error) {
          reject(error);
        }
      });
      break;
    }
    default: {}
  }
  return tempPromise;
}

  未完待續。。