手写Promise

class _Promise {
  static PENDING = "待定";
  static SUCCESS = "成功";
  static REJECTED = "失败";
  constructor(func) {
    console.log("reset");
    this.status = _Promise.PENDING;
    this.result = null;
    this.callbackReslove = [];
    this.callbackReject = [];
    try {
      func(this.resolve.bind(this), this.reject.bind(this));
    } catch (error) {
      this.reject(error);
    }
  }
  resolve(result) {
      if (this.status === _Promise.PENDING) {
        this.status = _Promise.SUCCESS;
        this.result = result;
        this.callbackReslove.forEach((callback) => {
          callback(result);
        });
      }
  }
  reject(result) {
      if (this.status === _Promise.PENDING) {
        this.status = _Promise.REJECTED;
        this.result = result;
        this.callbackReject.forEach((callback) => {
          callback(result);
        });
      }
  }
  then(onSuccess, onReject) {
    console.log("then start");
    return new _Promise((resolve, reject) => {
      onSuccess = typeof onSuccess === "function" ? onSuccess : () => {};
      onReject = typeof onReject === "function" ? onReject : () => {};
      if (this.status === _Promise.PENDING) {
        this.callbackReslove.push(onSuccess);
        this.callbackReject.push(onReject);
      }
      // console.log('onSuccess',this.callbackReslove,this.status);
      if (this.status === _Promise.SUCCESS) {
        setTimeout(() => {
          let result = onSuccess(this.result);
          isiPromise(result, resolve, reject);
        });
      }
      if (this.status === _Promise.REJECTED) {
        setTimeout(() => {
          onReject(this.result);
          isiPromise(result, resolve, reject);
        });
      }
    });
  }
  catch(onReject) {
    this.then(undefined, onReject);
  }
  all(promise) {
    return new _Promise((resolve, reject) => {
      let count = 0;
      let arr = [];
      for (let i = 0; i < promise.length; i++) {
        promise[i].then(
          (value) => {
            count++;
            arr[i] = value;
            if (count === promise.length) {
              resolve(arr);
            }
          },
          (reason) => {
            reject(reason);
          }
        );
      }
    });
  }
}
console.log("第一步");
const a = new _Promise((resolve, reject) => {
  console.log("第二步");
  resolve("这次一定");
});

a.then((e) => {
  console.log("then1", e);
  // return 'zc3d'
  return new _Promise((resolve, reject) => {
    resolve("这次三定");
  });
}).then((e) => {
  console.log("then2", e);
});

console.log("第三步");

// 处理返回值为_Promise的时候
function isiPromise(result, resolve, reject) {
  if (result instanceof _Promise) {
    result.then(resolve, reject);
  } else {
    resolve(result);
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值