最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue钩子函数中使用async、await 注意点

    正文概述 掘金(简单与秋夜)   2021-05-27   1398

    自己在开发中总会遇到很多问题,很多时候不记录就会忘记了,所以我打算记录下来伴随自己成长,如果有幸能帮到小伙伴那更美哉


    在vue中我们经常会有这种需求:

    async created() {
        // 需要等到上个代码执行完拿到值再做其他操作
        await this.userData(); //这里可以拿到userType
        //拿到userType 判断用户不是代理人展示不同信息
        if(this.userType==1){
          this.isAgent=true;
        }
    }
    

    先说注意点:

    1. 钩子函数只会在指定时间执行(Vue生命周期),使用延时器等是不会影响周期执行的
    2. 钩子函数里使用async,await, 后面只能跟promise,否则加async,awiat没有意义
    3. 我们常用的钩子函数 created、mounted 如果加了async,await,想要同步执行代码,代码必须放在同一个钩子函数里面

    • 钩子函数只会在指定时间执行(Vue生命周期),使用延时器等是不会影响周期执行的
    async created() {
        await setTimeout(() => {
          console.log(1);
        }, 100);
        console.log(2);
      },
    async mounted() {
      await setTimeout(() => {
          console.log(3);
        }, 100);
        console.log(4);
    }
    // 输出结果: 2 4 1 3
    // 结论: 所以await 加给setTimeout是没有生效的,延时器并没有影响生命周期执行
    
    • 钩子函数里使用async,await, 后面只能跟promise,否则加async,awiat没有意义
    // 根据上面代码看出, await 后面加延时器等其他类似需要延迟执行的函数是没用的
    // 然而await 后面加同步代码又多此一举
    // 而其实async,awiat是专门为了解决promise回调函数多层嵌套的问题
    async created() {
        await this.userData(); // 这个函数负责发请求获取数据,axios就是使用了promise
        //拿到userType 判断用户不是代理人展示不同信息
        if(this.userType==1){
          this.isAgent=true;
        }
    }
    // 结论: 这样写该周期函数下面的代码是会等待请求回来再执行的这样写是没问题的! 但仅仅限该周期函数!
    
    • 我们常用的钩子函数 created、mounted 如果加了async,await,想要同步执行代码,代码必须放在同一个钩子函数里面
    data() {
      return {
        name: ''
      }
    },
    async created() {
    // this.userInfo() 发送请求获取数据,然后赋值给this.name ---- this.name = res.data.name
      await this.userInfo()
      ...
    },
    mounted() {
      console.log(this.name) // 打印为''
    }
    
    // 结论: 不要以为mounted就一定比created后执行, 因为created加了async,await
    // mounted函数懒得等他伺候promise 就先执行了
    // 所以你在mounted里面不一定能拿到this.name进行赋值! 所以像这种有依赖上一个代码结果的最好写在一堆
    
    async created() {
    // this.userInfo() 发送请求获取数据,然后赋值给this.name ---- this.name = res.data.name
      await this.userInfo() // 拿到数据赋值成功
      console.log(this.name) // 打印成功
    },
    

    结尾:

    我想我记录都是些不太高深的问题,但是高深的我也不会哈哈哈~


    起源地下载网 » vue钩子函数中使用async、await 注意点

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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