定时器清除无效问题记录

高高兴兴下班后,没想到会被测试@。发现了一个定时器没有被清除,导致离开定时器所在路由后,定时器依然在工作。刚看到这个问题很是不解。

data() {
  return {
    timer:null
  }
},
beforeDestroy(){
  clearInterval(this.timer);
  this.timer = null;
}

明明在销毁前,把定时器给清除了,为什么不行呢?去官网上看了,官网推荐用这种写法,

const timer = setInterval(()=>{)
this.$once('hook:beforeDestroy', function () {
     clearInterval(timer);
  })

但是这种写法并不是很适合我的项目,而且我的写法官网说也是可以的,只是会有两个潜在问题:
1.它需要在这个组件实例中保存这个 picker,如果可以的话最好只有生命周期钩子可以访问到它。这并不算严重的问题,但是它可以被视为杂物。
2.我们的建立代码独立于我们的清理代码,这使得我们比较难于程序化地清理我们建立的所有东西。
但这并不会造成定时器无法清除的问题。
最后通过自己的测试发现每次点击保存后,在离开路由。定时器就会在别的页面出现,仔细检查下发现,每次保存后都开了一个新的定时器。

      if(this.timer!=null) {
        this.clearTimer();
      }
      this.timer = setInterval(() => {
      }, 5000);

最后每次开定时器前,检查下有米有旧的定时器,清除下ok了。

你可能感兴趣的:(定时器清除无效问题记录)