简单版手写promiss,包含resolve,reject,then链式调用

本文详细介绍了如何自定义Promise构造函数,包括resolve和reject方法的实现,以及.then和.catch方法的使用。通过实例演示了如何在MyPromise构造函数中处理异步操作,并展示了链式调用的用法。
摘要由CSDN通过智能技术生成
  // 要模拟promise的构造函数
  function MyPromise(fn) {
    this.data = null; // 要resolve的数据
    this.err = null; // 要reject的数据
    this.resolveCallback = null; // 存放resolve的回调,即  .then  里面的函数
    this.rejectCallback = null; // 存放reject的回调,即  .catch  里面的函数
    // 自定义resolve函数
    this.resolve = (data) => {
      this.data = data; // 将resolve的数据存起来
      this.then(this.resolveCallback); // resolve函数被执行了就要(再次)执行then方法
    };
    // 自定义reject函数,同上的resolve
    this.reject = (err) => {
      this.err = err;
      this.catch(this.rejectCallback)

    };
    /* 
      将自定义的resolve、reject函数 当参数 传到 后面的实例化构造函数中,
    */
    fn(this.resolve, this.reject)
  }

  /* 
    将方法定义到构造方法的prototype上,这样的好处是:
    通过该构造函数生成的实例所拥有的方法都是指向一个函数的索引,这样可以节省内存。
    当然也可不通过原型,将方法fun以函数的形式定义在构造函数之外,直接在构造函数内 this.fun = fun 也是一样的
  */
  MyPromise.prototype.then = function (callback) {
    // callback 已经赋值给了 this.resolveCallback ,说明是第二次执行此方法,是在resolve函数里执行的此方法
    this.resolveCallback && this.resolveCallback(this.data);
    // this.resolveCallback 是null,说明是第一次执行此方法,将callback 赋值给 this.resolveCallback
    this.resolveCallback || (this.resolveCallback = callback);
    // 因为存在 .then().catch() 链式调用,所以要return自己
    return this;
  }

  // 同上面的 MyPromise.prototype.then
  MyPromise.prototype.catch = function (callback) {
    this.rejectCallback && this.rejectCallback(this.err);
    this.rejectCallback || (this.rejectCallback = callback);
    return this;
  }

  // 验证一下
  let obj = new MyPromise((resolve, reject) => {
    setTimeout(() => {
      resolve("成功的数据")
    }, 1000)
    setTimeout(() => {
      reject("错误信息")
    }, 2000)
  })
  obj.then(res => {
    console.log("success:",res)
  }).catch(err => {
    console.log("fail:",err)
  })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值