js进阶之重复的定时器
使用setInterval()创建的定时器确保了定时器代码规则的插入队列中,这个的问题是:定时器代码可能在代码再次被添加到队列之前还没有完成执行,结果导致定时器代码连续运行了好几次,而之间没有任何停顿。(js引擎可以避免这个问题,当使用setInterval()时,仅当没有该定时器的任何其他代码实例时,这确保了定时器代码加入到队列中的最小时间间隔为指定间隔这就会出现两个问题)
1.某些间隔会被跳过
2.多个定时器的代码执行之间的间隔可能会比预期的小。
比如某个onclick事件处理程序,使用setInterval()设置一个200ms间隔的重复定时器。如果事件处理程序花了300ms,同时定时器代码也花了300多ms,就会出出现跳过间隔且连续运行定时器代码的情况。
这个 例子中第一个定时器是在205ms处添加到队列中的,但是过了300ms处才能够执行,当执行这个定时器代码时候,在405ms处又给队列添加了另一个副本,在下一个间隔,即605ms处,第一个定时器代码仍在运行,同时在队列中已经有了一个定时器代码的实例,结果是,在这个时间点上的定时器代码不会被添加到队列中,就是说,在5ms处添加的定时器代码结束后,405ms处添加的定时器代码就立刻执行。205ms的那个直接跳过了。
为了避免这两个问题可以用如下代码
setTimeout(function() {
//处理中
setTimeout(arguments.callee, interval);
},interval)
setTimeout 每次函数执行时候都会创建一个新的定时器,第二个setTimeout调用使用了arguments.callee 来获取对当前执行函数的引用,并为其设置另外一个定时器,这么做的好处:在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保了不会有缺失的间隔,而且确保了下一次定时器代码执行之前,至少等待指定的间隔。
写个简单的例子:
执行一段代码,将一个div代码向右移动,当移到坐标200时候停止。
setTimeout(function(){
let div = document.getElementById("myDiv")
left = parseInt(div.style.left) + 5;
div.style.left = left + "px";
if(left < 200) {
setTimeout(argument.callee,50)
}
},50)
最新文章
- Unable to create the selected property page. An error occurred while automatically activating bundle net.sourceforge.pmd
- VS快捷键总结(包括ReSharper)
- FreeBSD_11-系统管理——{Part_7 - AUDIT}
- (转)nginx优化 实现10万并发访问量
- 设置 tableview 的背景 颜色 和清空
- 在Android软按键中添加Menu键
- Cheatsheet: 2015 03.01 ~ 03.31
- mysql最大连接数
- php将数据库导出成excel的方法
- Tsinsen A1516. fx 数位dp
- linux 打补丁 2原理
- pyfits过滤数据更新文件。
- 【原创】Ionic单页应用跳转外链,构造路由返回的解决办法及代码
- file的基本操作;file的修改
- ActiveMQ(3)---ActiveMQ原理分析之消息持久化
- python爬虫scrapy之scrapy终端(Scrapy shell)
- Bloxorz I POJ - 3322 (bfs)
- Linux修改网卡名称的方法
- Android NetworkInterface 的 name
- string.Format格式化输出
热门文章
- redis day03
- 使用java读取解析txt文本数据,管理简单的数据
- 2018 ACM-ICPC 宁夏 H.Fight Against Monsters(贪心)
- 3)PHP的http 并发
- 允许外部访问Windows本机的指定端口
- [LC] 144. Binary Tree Preorder Traversal
- 接口测试 requests的身份认证方式
- 安装php5.4 mv9 +apache2.2+mysql5.5问题好多。
- [LC] 252. Meeting Rooms
- spring security梳理