手写Promise


// 定义Promise
function myPromise(excutor) {
  let self = this;
  self.status = "pending"; // 定一个状态
  self.value = null; // 成功的返回的结果
  self.reason = null; //失败的原因

  // 7. 解决异步问题 暂存区
  self.onFulfilledCallbacks = [];
  self.onRejectedCallbacks = [];

  // 成功的回调
  function resolve(value) {
    // 5.1
    if (self.status === "pending") {
      self.value = value; // 成功之后返回的数据
      self.status = "fulfilled";
      // 9. 状态改变 依次取出执行
      self.onFulfilledCallbacks.forEach((item) => item(value));
    }
  }
  // 失败的回调
  function reject(reason) {
    // 5.2
    if (self.status === "pending") {
      self.value = reason; // 失败的原因
      self.status = "rejected";
      // 9. 状态改变 依次取出执行
      self.onRejectedCallbacks.forEach((item) => item(reason));
    }
  }
  // 4. 立即执行
  // excutor && excutor(resolve, reject)
  try {
    excutor(resolve, reject);
  } catch (error) {
    reject(error);
  }
}
// 2. then
myPromise.prototype.then = function (onFulilled, onRejected) {
  // 6.
  onFulilled =
    typeof onFulilled === "function"
      ? onFulilled
      : function (data) {
          resolve(data);
        };

  //
  onRejected =
    typeof onRejected === "function"
      ? onRejected
      : function (err) {
          throw new Error(err);
        };

  let self = this;
  if (self.status === "fulfilled") {
    return new myPromise((resolve, reject) => {
      try {
        let x = onFulilled(self.value);
        x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
      } catch (error) {
        reject(error);
      }
    });
  }
  if (self.status === "rejected") {
    return new myPromise((resolve, reject) => {
      try {
        let x = onRejected(self.value);
        x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
      } catch (error) {
        reject(error);
      }
    });
  }
  if (self.status === "pending") {
    return new myPromise((resolve, reject) => {
      self.onFulfilledCallbacks.push(() => {
        let x = onFulilled(self.value);
        x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
      });
      self.onRejectedCallbacks.push(() => {
        let x = onRejected(self.value);
        x instanceof myPromise ? x.then(resolve, reject) : resolve(x);
      });
    });
  }
};
myPromise.prototype.catch = function (fn) {
  return this.then(null, fn);
};


文章作者: 神奈川
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 神奈川 !
  目录