最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Promises/A+ 规范写一个自己的Promise

    正文概述 掘金(nameIsZoe27)   2021-05-04   453

    前言

    百度了很多次别人写的promise ,也是一时兴起 今天自己写了一个并且做了这么一个记录

    Promises/A+

    同学们:此处自行查阅Promises/A+规范

    Just do it

    接下来我根据我自己习惯看规范

    菜?自己的翻译:class Promise{}和function Promise{} 都行,那我写的是class

     class Promise{
            constructor(execuctor) {}
        }
     export default Promise
    

    菜?自己的翻译:每个promise 都有三个状态 ,且pedding状态时可变更(通过resolve和reject) fulfilled, or rejected,但只支持变更一次,不能转变成任何其他状态。

    菜?自己的翻译: resolve() 和reject() 的参数 和其值的初始化,结合2做状态变更处理

    //class 同级外层 定义状态的常量,等待使用,实际过程中为了可读性,通常都会定义常量
    //状态常量
    /**初始化状态*/
    const PENDING = "PENDING";
    /**成功状态*/
    const FULFILLED = "FULFILLED";
    /**失败状态*/
    const REJECTED = "REJECTED";
    
     class Promise{
            constructor(execuctor) {
              this.status = PENDING;
              this.value = undefined;
              this.reason = undefined;
              const resolve = (val) => {
                  // 状态变更后 不可以在更改为其他状态,只支持修改一次
                  if (this.status === PENDING) {
                    this.value = val; //成功状态时 value的赋值
                    this.status = FULFILLED; //修改状态
                  }
                };
              const reject = (err) => {
                  // 状态变更后 不可以在更改为其他状态,只支持修改一次
                  if (this.status === PENDING) {
                    this.reason = err; //失败状态时的 reason的赋值
                    this.status = REJECTED; //修改状态
                  }
            }
    
        }
    

    菜?自己的翻译:throw 语句抛出的异常。这里按照我自己的理解 用try,catch 捕获异常的时候 调用reject(err)

    try {
          execuctor(resolve, reject);
        } catch (err) {
          reject(err);
        }
    

    菜?自己的翻译:then 方法的支持,FULFILLED执行onFulfilled,REJECTED执行onRejected而且参数均得是函数,这里规范我们没有全部粘贴

    then(onFulfilled, onRejected) {
        if (this.status === FULFILLED) {
          onFulfilled(this.value);
        }
        if (this.status === REJECTED) {
          onRejected(this.reason);
        }
    

    完整代码

    class Promise {
      constructor(execuctor) {
        this.status = PENDING;
        this.value = undefined;
        this.reason = undefined;
        const resolve = (val) => {
          // 状态变更后 不可以在更改为其他状态,只支持修改一次
          if (this.status === PENDING) {
            this.value = val; //成功状态时 value的赋值
            this.status = FULFILLED; //修改状态
          }
        };
        const reject = (err) => {
          // 状态变更后 不可以在更改为其他状态,只支持修改一次
          if (this.status === PENDING) {
            this.reason = err; //失败状态时的 reason的赋值
            this.status = REJECTED; //修改状态
          }
        };
        try {
          execuctor(resolve, reject);
        } catch (err) {
          reject(err);
        }
      }
      then(onFulfilled, onRejected) {
      //then 的参数 resolve函数,和reject函数
        if (this.status === FULFILLED) {
          onFulfilled(this.value);
        }
        if (this.status === REJECTED) {
          onRejected(this.reason);
        }
      }
    }
     export default Promise
    
    

    我们测试结果 测试插件用的是 code run (按照指南VS code插件分享之 --- Run Code)

    Promises/A+ 规范写一个自己的Promise

    Promises/A+ 规范写一个自己的Promise

    小结

    到这里就写完了一个简易promise的全部代码,已经很晚了下次再写好了


    起源地下载网 » Promises/A+ 规范写一个自己的Promise

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元