vue项目开发中setTimeout等定时器的管理问题


Posted in Javascript onSeptember 13, 2018

一、问题来源。

在项目中,我们经常有这样的需求,一个页面初始化后,需要不断的去请求后端,来获取当前某个记录的最新状态。

显然,这个可以用setTimeout以及回调中继续setTimeout来实现。

我们假设定时器是在页面#/test/aaa上创建的。

但是,会遇到以下两个问题,我从#/test/aaa   这个页面切换到  #/test/bbb页面后如果停留在#/test/bbb,定时器还在跑。

其次,如果我不断在#/test/aaa 和 #/test/bbb两个页面之间不断的切换,而且切换时间小于定时器的间隔时间时,也会出现

重复创建setTimeout的情况。

现在的问题就是,我们如何做到管理定时器。

二、示例代码。

created() {
  if ( this.timeOut ) {
    clearTimeout(this.timeOut);
  }
  this.getListIng();
},
computed: {
  timeOut: {
    set (val) {
      this.$store.state.timeout.compileTimeout = val;
    },
    get() {
      return this.$store.state.timeout.compileTimeout;
    }
  },
},
methods: {
  getListIng() {
    // 这里是一个http的异步请求
    if ( getUrlModule() == 'aaa' ) {
      let _this = this;
      this.timeOut = setTimeout(() => {
        _this.getListIng();
      }, 5000);
    } else {
      this.timeOut = '';
    }
  },
}

(1)如上面代码所示,当创建页面(created执行)时,会先判断变量this.timeOut是否存在,如果存在,先clearTimeout掉。

(2)而,this.timeOut这个变量对应的是全局store里的this.$store.state.timeout.compileTimeout。并且是双向绑定的,这个

请自行搜索vue2.0中computed用法。

 (3)在我们的主函数getListIng()中,会先使用函数getUrlModule()根据url判断当前页面是否是aaa页面,如果是的,就执行setTimeOut,

如果不是,就不行执行了,并且设置this.timeOut = '';

我们假设上面没有if ( getUrlModule() == 'aaa' ) 这句判断,会出现,当我们已经跳出了当前aaa页面,去了bbb页面并且一直停留在bbb页面时,

还有setTimeout在执行,就会不断有http的请求。

如果没有if ( this.timeOut ) { clearTimeout(this.timeOut); } 这句代码。当我们不断在2个页面之间切换时,且切换的频率很高。会出现多次创建

setTimeout的情况。这个逻辑稍微有点绕,请阅读者自行演算。

三、我们必须清楚的事实。

(1)vue中$store里创建的变量,其实是全局变量,这个变量在切换页面时不会清除,当我们刷新页面时会清除掉。

(2)在前端页面中,当我们刷新页面时,会将当前页面之前创建的setTimeout以及其他定时器都清除掉。但是,切换页面(仅仅是路由切换)

是不会清除的。

(3)setTimeout、setinterval有本质的不同,前者只执行一次,除非你在回调中,不断的调用,而后者是不间断调用的。但是,我在各种实践中发现,

还是setTimeout好用。因为,setTimeout可以根据条件,及时在回调中停用。如果采用setinterval,我们很有可能捕捉不到停用的条件而无法停用。

补充:Vue之SetTimeout

1.前言

相信很多人都遇到过这样的问题,页面数据需要不断的刷新,也就是不断的发送ajax请求来更新数据,那么在vue中怎样做才比较好呢?这里介绍一下我踩的坑,以及解决方案

2.问题

settimeout用来调用请求数据,但是我遇到的问题就是,没有用合适的方式去关闭settimeout,出现了离开当前页面,请求还在不断的发送问题,这样给服务器带来了无必要的压力。附上之前的代码:

self.deployTimeOutId = setTimeout(() => {
              self.getDeployList(false);
            }, 5000);

说明:这一段代码是嵌在getDeployList方法中的,离开当前页面的是时候,必须要去手动的把这个settimeout清除才行。一般这个写在destoryed()这个钩子里。

window.clearTimeout(this.deployTimeOutId);

虽然这样处理了,但在逻辑比较复杂的情况下,还是出现了没有关闭的情况,而且排查起来很痛苦。下面介绍一种针对Vue比较好的做法。

3.解决方案

let self=this;
  if (self && !self._isDestroyed) {
            setTimeout(() => {
              if (self && !self._isDestroyed)
                self.getDeployList();
            }, 5000);
          }

_isDestroyed这个属性表示的是当前这个组件是否有被销毁,true表示当前的组件已经被销毁,通过上面这个判断,我们就不需要自己手动的去用ID来清除了,这个就相当于递归嘛,有了一个结束判断,避免了死循环咯~~

总结

以上所述是小编给大家介绍的vue项目开发中setTimeout等定时器的管理问题,希望对大家有所帮助,如果大家有任何疑问请

给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于逻辑运算的简单权限系统(实现) JS 版
Mar 24 Javascript
使用JavaScript构建JSON格式字符串实现步骤
Mar 22 Javascript
js判断登录与否并确定跳转页面的方法
Jan 30 Javascript
javascript设置页面背景色及背景图片的方法
Dec 29 Javascript
js console.log打印对像与数组用法详解
Jan 21 Javascript
详解能在多种前端框架下使用的表格控件
Jan 11 Javascript
原生js实现验证码功能
Mar 16 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
Three.js开发实现3D地图的实践过程总结
Nov 20 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
Vuex的actions属性的具体使用
Apr 14 Javascript
初学node.js中实现删除用户路由
May 27 Javascript
详解react内联样式使用webpack将px转rem
Sep 13 #Javascript
详解webpack 热更新优化
Sep 13 #Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 #Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 #Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 #Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
Sep 13 #Javascript
mpvue中使用flyjs全局拦截的实现代码
Sep 13 #Javascript
You might like
5.PHP的其他功能
2006/10/09 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
php动态绑定变量的用法
2015/06/16 PHP
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
python redis存入字典序列化存储教程
2020/07/16 Python
python collections模块的使用
2020/10/16 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
环境卫生倡议书
2014/08/29 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
《围炉夜话》110句人生箴言,精辟有内涵,引人深思
2019/10/23 职场文书
Python绘画好看的星空图
2022/03/17 Python
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android