为了账号安全,请及时绑定邮箱和手机立即绑定

promise原理(一)

标签:
前端工具

简易版

  • 实现了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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消