js之重复定时器

        今天介绍js重复定时器,前段时间在一个项目群里看到有人问,为了解决业务需求需要定义多个定时器来控制事件驱动,我就把自己在一本书上学到的重复定时器一点小知识分享出来,有需要的可以了解了解。

        每个浏览器窗口、标签页或者frame都有其各自的代码执行队列。这意味着,进行跨frame或者跨窗口的定时调用,当代码同时执行的时候可能会导致竞争条件。无论何时需要用到这种通信类型,最好是在接收frame或者窗口中创建一个定时器来执行代码。

       使用setTimeout()和setInterval()创建的定时器可以实现在指定的时间间隔执行程序,但是这也只是表面上看去好像代码就在精确指定的时间点上执行了。其实,javascript是运行于单线程的环境中,而定时器仅仅只是计划代码在未来的某个时间执行。执行时机是不能保证的,因为在页面的生命周期里,不同时间可能有其他代码在控制js进程。实际上,浏览器负责排序,指派某段代码在某个时间点运行的优先级。

      我们可以把js想象成在时间线上运行,当页面载入时,首先执行任何包含在<script>元素内的代码,通常是页面生命周期后面要用到的一些简单的函数和变量的声明,有时候也包含一些初始数据的处理等。之后,js进程将等待更多代码执行。当进程空闲的时候,下一个代码会被触发并立刻执行。所以,分析得知,js正常工作除了js主线程外,还有一个需要在进程下一次空闲时执行的代码队列。随着页面在其生命周期中的推移,代码会按照执行顺序添加入这个队列,然后在进程空闲时尽快执行队列中的代码片段。在js中没有任何代码是立刻执行的,只能保证是尽快执行,一旦进程空闲就立刻执行它。

      定时器对队列的工作方式是,当特定时间过后去将代码插入。注意:给队列插入添加的这部分代码并不意味着立刻执行,而只表示它会尽快执行。指定的时间间隔表示何时将定时器的代码添加到队列,而不是何时实际执行代码。设定了一个100ms后执行的定时器并不代表到了100ms代码就立刻执行,它表示代码会在100ms后被加入到队列,此时,刚好进程处于空闲状态则马上就执行这段代码,表面上看好像在指定时间内精确执行了。实际上,如果在这个时间点上,进程处于忙状态,此时定时器代码只能等待,等待进程空闲后马上执行,代码可能明显等待更长时间才能执行。

       以setInterval()为例:当业务层出现了设置重复定时器的情况,就会引发两个问题:(1)某些间隔会被跳过,(2)多个定时器的代码执行之间的间隔会比预期小。因为js中有避免的一套机制,仅当未含有定时器的任何代码实例才能添加到队列中,导致某些间隔被跳过;本次还未执行完毕,下一次间隔时间到,就会导致定时器代码同时出现跳过间隔且连续运行好几次情况。

173915_5oSw_3544533.png

        这个例子中第一个定时器在205ms处添加到队列中,但是过了300ms处才执行。当执行这个定时器代码时,在405ms处又给队列添加了一个副本。在下一个时间间隔即605ms处,第一个定时器代码还没有执行完毕,此时进程忙且队列中已经有了一个定时器代码实例(正在执行的定时器代码),根据js的处理机制605ms的这个时间点上的定时器代码不会被插入到队列中,定时器代码跳过。结果在5ms处添加的定时器代码执行结束之后,405ms处添加的定时器代码就立刻执行。

采取链式调用setTimeout()避免使用setInterval()的重复定时器的2个缺点.

(function(){

//处理中

setTimeout(arguments.callee,inerval);

},interval);

 

       这个模式链式调用了setTimeout(),每次执行的时候就创建一个新的定时器。第二个setTimeout()调用arguments.acllee来获取对当前执行的函数的引用,并为其设置另一个定时器。这样做的好处是,在前一个定时器代码执行完之前,不会向队列出插入新的定时器代码,确保不会有任何缺失的间隔。而且,还可以保证在下一次定时器代码执行之前,至少要等指定的间隔,避免了连续的运行。

实现将一个div元素向右移动的动画,当坐标在200像素时停止。

setTimeout(function(){

var div=document.getElementById("mydiv");

left=parseInt(div.style.left)+5;

div.style.left=left+"px";

if(left<200)

{

setTimeout(arguments.callee,50);

}

},50);

 

 

转载于:https://my.oschina.net/u/3544533/blog/1604801

模组 RG500Q入网问题分析 - [ ] 不同于公网,在5G专网环境中, 通常使用很多非标准的网络配置,如PLMN/APN等。因此,5G模组在专网环境下通常要做一些专门的配置才能正常入网,本文分析一例在专网环境, 5G终端无法入网问题的定位过程。 - [ ] 具体涉及到以下模组操作: 恢复出厂、SA only、锁BAND、配置MBN等 阅读详情

相关推荐

Windows 11 - 打开操作安全中心提示 “需要使用新应用以打开此 Windowsdefender 链接“ 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开)

Windows 11 - 打开操作安全中心提示 "需要使用新应用以打开此 Windowsdefender 链接" 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开),当您点击任务栏上要关闭安全中心防护设置时,这种情况打不开怎么解决,怎么办,Windows安全中心,病毒和威胁保护,账户保护,防火墙和网络保护,设备安全性。

🏆 前端领域优质创作者 1万+

定时器的声明以及判断定时器是否存在

1.用于判断js定时器是否存在,存在则清除定时器 var imlNumberInterval,resetTimeoutInterval; //设置超时定时器 resetTimeoutInterval = setTimeout(function(){ //业务逻辑 }, 2 * 60 *1000);//每隔2 mins执行 //设置定时执行定时器 imlNumberInterval=setI

LH9898的博客 1万+

Windows 10 本地硬盘变成了可弹出磁盘

今天新装了系统, 电脑是一个SSD+HHD, 没想到装好之后右下角显示可安全删除设备, 两个硬盘在那里. 这还得了. 查了一下午, 大致知道了是什么问题. Standard SATA AHCI controller使用高性能的硬盘模式就会把硬盘看作是一个可热插拔的存储器, 所以自然就会显示可弹出. 如果你的BIOS支持关闭HotSwap或者HotPlug, 那么直接关闭就可以了. 或者你直接在BIOS里把磁盘模式改为IDE, 不过这样就发挥不好你SSD的高性能了. 还有一种解决方法, 就是手动让系统把这两个

落日之城 4万+

同名函数加载及定时器清除问题

Title .father{ padding:0; margin:0px; position: relative; } .box{ width: 50px; height: 50px; backgr

qq_34481114的博客 517

js网页通用定时器

写了一个通用的定时器,new了定时器之后,start,stop,clear都可以。可以抽成一个js文件。目前对于执行有参数的函数有点困难,暂时通过使用无参数函数包裹和全局变量的办法进行规避。 <html> <script> /** * 定时器 * */ /** * 以id为key的定时器map 可以通过$myTimerMap[id]来获取该id对应...

shy_snow的专栏 872

js定时器变成同步

js定时器变成同步,例如:让5秒的定时器先执行,再让4秒的定时器执行,再让3秒的定时器执行

YAYTXT的博客 2545

js定时器

js中内置的一个方法。

weixin_55355282的博客 5304

js重复创建定时器的解决

js重复创建定时器的解决1. 问题描述2. 问题分析2. 解决思路 解决重复创建定时器的BUG 1. 问题描述 在点击事件中创建定时器,制作一些动画,如果重复点击,会导致动画的速度加快 如,下面的星星随机移动的主代码: function f1() { var i = 0;//测试用,执行5次,就清除定时器 var timerId = setInterval(func...

ckxkobe的博客 2974

JS定时器的一些特性和如何避免重复设置定时器的三种解决方法

JS定时器的一些特性和如何避免重复设置定时器 概述和总结 每个JS定时器产生时会被系统分配一个id,这个id是正整数,而且一个页面里面的定时器id不重复,我们能用一个变量接收这个id,但是如果重复执行一条接收创建语句,那么你只能接收到最新创建的定时器的id,之前创建的定时器的id会被覆盖,但是定时器数量在增加,这就会导致界面一些功能错乱,解决方法就是在重复按开始按钮时,如果已经有了一个定时器那么就不执行语句,我列出了错误代码和三种解决方法,可以解决定时器重复创建问题。 ps:定时器id的配发是递增的,从1开

weixin_54597170的博客 2905

js定时器(执行一次、重复执行)

js定时器(执行一次、重复执行) 这篇文章主要分享一段js代码,有关js定时器的小例子,分为执行一次的定时器重复执行的定时器,需要的朋友可以参考下 1,只执行一次的定时器 复制代码代码如下: 2,重复执行的定时器 复制代码代码如下: 备注: 如果在一个页面中有两个方法,都是在页面加载完成之后执行的,实际却未能按先后顺序执行,可以参照如下方法解决: 可以在onload方法中添加一个定时器,设置...

lvwuwei的博客 7189

JavaScript】使用定时器实现Js的延期执行或重复执行setTimeout,setInterval

使用定时器实现JavaScript的延期执行或重复执行window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval。其中前者可以使一段代码在指定时间后运行;而后者则可以使一段代码每过指定时间就运行一次。它们的原型如下:window.setTimeout(expression,milliseconds);window.setIn

2万+

JS定时器整理(执行一次setTimeout、重复执行setInterval)

js定时器整理(执行一次setTimeout、重复执行setInterval) 在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout(“function();”,delaytime); ​2.循环定时器:timename=setInterval(“function();”,delaytime); 第一个参数“function()”是定时器触发时要执行的动作,可以是一个函数,也可以是几个函数,函数间用“;”隔开即可。 比如要弹出两个警告窗口,

CC酱写前端的博客 7814

js一次性定时器与可重复定时器

一次性定时器用一次就自动清除,可重复定时器会一直执行,直到手动执行清除函数。setInterval(js函数,时间);clearInterval(指定一个对象)setTimeOut(js函数,时间);clearTimeOut(指定一个对象)#粤嵌星计划,粤嵌我来了#

welcome 1829

js 定时器 执行一次和重复执行

js 定时器 执行一次和重复执行 1- 执行一次(延时定时器) var t1 = window.setTimeout(function() { console.log(‘1秒钟之后执行了’) window.clearTimeout(t1) // 去除定时器 },1000) 2- 重复执行(间歇定时器) var t2 = window.setInterval(function() { con...

qq_44552416的博客 1410

解决在JS中阻止定时器重复”开启问题、Vue中定时器的使用

解决在JS中阻止定时器重复”开启问题、Vue中定时器的使用

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 2192

JS定时器例子讲解

摘自http://blog.sina.com.cn/s/blog_8df07b6f0100uea3.html 在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime); 2.循环定时器:timename=setInterval("function();",delaytime);

zhaozhenall的专栏 1462

分布式定时任务重复执行记录

背景: 一个项目拆分了几个可单独运行的模块。 A模块中的定时器每个30s去执行一次任务,A模块中的定时器每个30s去执行一次任务(任务内容是远程获取消息并处理发送)。原定是A模块部署到两个服务器,同时建立了数据库表作为分布式锁。但是目前A模块独立运行两个之后总是会获取到相同的远程消息,然后重复执行处理了两次。 技术: 原本是在ssm框架下的定时任务是没有出现重复执行的情况,现在迁移到了spring...

食火的埃尔德里奇 1738

定时任务会重复执行俩次的解决方法

情景:在使用SpringMVC的定时任务的注解时,发现自己的定时任务会重复执行俩次。这是为什么呢? java代码: spring-mvc.xml配置: 这样配置完后,在启动项目后,项目便能按照指定的时间,间隔半小时执行一次。任务是没半小时执行了,但是每次会重复俩次插入操作。这让我有些费解了。我上网搜索了一下类似的情况的前辈们的解决方法,然后才知道原因。 原因...

weixin_30471561的博客 1171

重复定时器 setInterval 存在的问题

使用 setInterval() 创建的定时器确保了定时器代码规则地插入队列中。这个方式的问题在于,定时器代码可能在代码再次被添加到队列之前还没有完成执行,结果导致定时器代码连续运行好几次,而之间没有任何停顿。幸好,Javascript 引擎够聪明,能够避免这个问题。当使用setInterval() 时,仅当没有该定时器的任何其他代码实例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔。 ...

weixin_42549581的博客 2137

JESD22-B117A中文版.pdf

JESD22-B117A中文版.pdfJESD22-B117A中文版.pdfJESD22-B117A中文版.pdfJESD22-B117A中文版.pdfJESD22-B117A中文版.pdf

车载GPS终端测试方案汇总.doc

车载GPS终端测试方案汇总.doc

上一篇: K近邻(knn)算法预测电影类型
下一篇: 11.5. Date and Time
weixin_34318326
博客等级 码龄10年 5429粉丝 700原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值