Vue中使用定时器实现轮询setTimeout

需求:扫描二维码登录,生成二维码后需要通过轮询来判断登录状态。
async getQrcode() {
      this.clearTimer()
      let res = await this.$http.post("account/loginbyqrcode")
      this.loginQrcode = "data:img/jpg;base64," + res.Data.qrcode;
      this.handleQrcodeCheck();
    },
async handleQrcodeCheck() {
      let timerId = await new Promise(resovle => {
        let timerId = setTimeout(async () => {
          try {
            let res = await this.$http.post("account/checkloginqrcodestatus");
            this.clearTimer()
            this.$message({
              message: "登录成功",
              type: "success"
            });
            this.$router.push({ path: "/home/index" });
          } catch (err) {
            console.log(err);
            this.handleQrcodeCheck();
          }
        }, 1000);
        resovle(timerId);
      });
      this.timerIdEnd = timerId;  //在data中定义,它永远是最后一个定时器的id
    },
    clearTimer() {   //清除最近的100个定时器,如果只清除最后一个,会出现bug
      let end = this.timerIdEnd;
      let start = end - 100 > 0 ? end - 100 : 0;
      for (let i = start; i <= end; i++) {
        clearTimeout(i);
      }
    }

这里需要注意下,如果用户生成了二维码,开始轮询。用户如果不扫码,当你点击别的页面时,轮询依然会继续,所以我们一定要在跳转页面时也需要清除定时器,不然会一直占用服务器资源。在vue的生命周期函数beforeDestroy加上

  beforeDestroy() {
    this.clearTimer()
  }
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值