es6 promise简易实现

直接上代码吧:

function MyPromise(fn) {
  // 固定this指向
  let _this = this;
  // pending, rejected, resolved
  _this.status = 'pending';
  // 存储promise定义时传入的值
  _this.value = '';
  // 存储resolve回调函数,主要用于resolve异步执行时存储then中传入的回调函数,非异步直接在then中执行
  _this.resolveFnArr = [];
  // 存储reject回调函数
  _this.rejectFnArr = [];
  // pending -> resolved
  function resolve (param) {
    if (_this.status === 'pending') {
      _this.status = 'resolved';
      _this.value = param;
      // 异步执行resolve时
      _this.resolveFnArr.length && _this.resolveFnArr.forEach(f => {
        f(_this.value);
      });
    }
  }
  // pending -> rejected
  function reject (reason) {
    if (_this.status === 'pending') {
      _this.status = 'rejected';
      _this.value = reason;
      // 异步执行reject时
      _this.rejectFnArr.length && _this.rejectFnArr.forEach(f => {
        f(_this.value);
      });
    }
  }
  // 执行构造函数并捕获构造异常
  try {
    fn(resolve,reject);
  } catch (e) {
    reject(e);
  }
}
// 添加then方法
MyPromise.prototype.then = function (resolvedFn, rejectedFn) {
  let _this = this;
  // 返回promise对象链式调用
  let tempPromise = null;
  switch (_this.status) {
    case 'pending': {
      tempPromise = new MyPromise(function (resolve, reject) {
        // 在resolve或者reject之前执行then函数,先把回调函数存储起来,状态改变后执行
        _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;
}

未完待续。。

posted @ 2020-08-05 18:36  lsboom  阅读(195)  评论(0编辑  收藏  举报