继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

promise原理(一)

DIEA
关注TA
已关注
手记 434
粉丝 63
获赞 387

简易版

  • 实现了promise的状态管理(padding->resolved)(padding->rejected)

  • 实现了promise的then函数(公有属性)

  • 实现了promise中对异步函数的处理(发布订阅)

  • 实现了promise的参数传递(利用挂载到promise对象上实现value,reason共享)

  • 实现了promise的异常捕捉(try--catch--reject)


  • 没有实现链式调用(情况较多,难度系数较高)

  • 没有实现catch错误处理

  • 没有实现all,race,reject ,resolve等方法


//ES6定义promise构造函数class Promise {  constructor(executor) {//私有属性
    // 默认状态是等待态
    this.status = 'pending';//初始状态padding
    this.value = undefined;//
    this.reason = undefined;//
    // 存放成功的回调(订阅发布中的事件池,当promise中是异步的情况下,不能立即执行)
    this.onResolvedCallbacks = [];    // 存放失败的回调(订阅发布中的事件池,当promise中是异步的情况下,不能立即执行)
    this.onRejectedCallbacks = [];    let resolve = (data) => {      if (this.status === 'pending') {//只有等待状态才可以转化成成功状态
        this.value = data;//把当前的值传递给promsie对象,,已便then函数中onFulFilled回调使用
        this.status = 'resolved';//改变当前状态为resolved,且不能再次改变
        this.onResolvedCallbacks.forEach(fn => fn());//当resolve函数执行时,执行成功事件池中的所有回调(订阅)
      }
    }    let reject = (reason) => {      if (this.status === 'pending') {//只有等待状态才可以转化成失败状态
        this.reason = reason;//把失败的原因传递给promise对象,已便then函数中onRejected回调使用
        this.status = 'rejected';//改变当前状态为rejected,且不能再次改变
        this.onRejectedCallbacks.forEach(fn => fn());//当reject函数执行时,执行失败事件池中的所有回调(订阅)
      }
    }    try { // 执行时可能会发生异常
      executor(resolve, reject);
    } catch (e) {
      reject(e); // promise失败了,直接调用reject函数,捕捉错误
    }
  }
  then(onFulFilled, onRejected) {  //公有属性 then 方法
  //判断状态调用不同的处理函数
    if (this.status === 'resolved') {//如果当前状态改变为resolved,那么就执行then的第一个回调,并传入this.value值
      onFulFilled(this.value);
    }    if (this.status === 'rejected') {//如果当前状态改变为rejected,那么就执行then的第二个回调,并传入失败原因this.reason
      onRejected(this.reason);
    }    // 当前既没有完成 也没有失败(说明resolve和reject都没有执行,在异步函数中)
    if (this.status === 'pending') {      // 存放成功的回调(发布订阅中的订阅,当resolve执行时发布,执行所有的then中的onFulFilled)
      this.onResolvedCallbacks.push(() => {
        onFulFilled(this.value);
      });      // 存放失败的回调(发布订阅中的订阅,当reject执行时发布,执行所有的then中的onRejected)
      this.onRejectedCallbacks.push(() => {
        onRejected(this.reason);
      });
    }
  }
}module.exports = Promise;



作者:Mr无愧于心
链接:https://www.jianshu.com/p/44a971659696


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP