首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从一个超时程序的设计聊聊定时器的方方面面

在上面的代码,函数setInterval将产生一个间隔定时器。JS定时器共有三种:间隔定时器、超时定时器、立即定时器。...在代码1中,我们设定定时器每隔1秒触发一次,但在实际的运行过程中,无法保证每隔1秒执行一次。如果间隔时间无法保证,例如延后,那么总执行时间就要长于允许的总时间。...但是,超时定时器的执行同样受到JS是单线程的限制,即使轮询代码是一样的,但不能保证其它地方在本次循环中没有新增的代码,所以使用setTimeout模拟的间隔定时器,仍然不能保证相待的间隔时间。...不同浏览器的实现也不一样,比如,Chrome可以设置1ms,IE11/Edge是4ms。...换言之,如果间隔时间较长,使用setInterval基本没有问题;如果间隔时间较短,且上下可能存在数据依赖或资源竞争,当使用setTimeout。 下面的代码为什么在小游戏中不能运行

1.3K20

深度解密setTimeout和setInterval——为setInterval正名!

就是获取当前时间的操作,通过这个操作,我们就可以每次运行的时候修复间隔时间,让总时长不至于偏差太大。...将setInterval封装成和上述setTimeout一样的函数,包括用法,区别在于setInterval不需要重复调用自身。只需要在回调函数中控制时间即可。...哈哈苍天饶过谁,在相同时间,相同压力的情况下,都出现跳帧超时,不过两人的原因不一样setTimeout压根没有执行,而setInterval是因为抛弃相同队列下相同定时器的其他callback也就是只保留了了队列中的第一个挤进来的...但是JS很忙的,如果一直不断的有task任务,那么JS永远无法进入下一个循环。JS说我好累,我不干活了,罢工。...就像公交车一样,一站一站之间的时间虽然可以预估,但是难免有意外发生,比如堵车,比如乘客太多导致上车时间过长,比如不小心每个路口都吃到了红灯等等意外情况,都会导致公交陈晚点。

2.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

为什么要用 setTimeout 模拟 setInterval

毫秒 // 与原设定的间隔时差: 771 毫秒 // 与原设定的间隔时差: 887 毫秒 // 与原设定的间隔时差: 981 毫秒 // 与原设定的间隔时差: 1142 毫秒 // 与原设定的间隔时差...), "毫秒"     ); }, 1000) 输出: // 与原设定的间隔时差: 567 毫秒 // 与原设定的间隔时差: 552 毫秒 // 与原设定的间隔时差: 563 毫秒 // 与原设定的间隔时差...: 554 毫秒(2次) // 与原设定的间隔时差: 564 毫秒 // 与原设定的间隔时差: 602 毫秒 // 与原设定的间隔时差: 573 毫秒 // 与原设定的间隔时差: 633 毫秒...综上所述,setInterval 有两个缺点: - 使用 setInterval 时,某些间隔会被跳过; - 可能多个定时器会连续执行; 可以这么理解:**每个 setTimeout 产生的任务会直接 ...() 一样使用它 ```js interval(function() {}, 20); ``` 3.终止定时器 ```js if (timer) { window.clearSetTimeout(timer

1.2K40

如何让定时器在页面最小化的时候不执行?

}, [delay]); } setTimeout 和 setInterval 的问题 首先,setTimeout 和 setInterval 作为事件循环中宏任务的“两大主力”,它的执行时机不能跟我们预期一样准确的...),不同的浏览器中设置不同的时间间隔的时候,其表现不一样。...根据 当浏览器切换到其他标签页或者最小化时,你的js定时器还准时吗?[2] 这篇文章的实践结论如下: 谷歌浏览器中,当页面处于不可见状态时,setInterval 的最小间隔时间会被限制为 1s。...火狐浏览器的 setInterval 和谷歌特性一致,但是 ie 浏览器没有对不可见状态时的 setInterval 进行性能优化,不可见前后间隔时间不变。...id: 0, }; const loop = () => { const current = new Date().getTime(); // 当前时间 - 开始时间,大于设置间隔

1.4K10

setTimeout的那些事

贯彻此精神的代码,会让整个JS运行环境和谐运行。 给setTimeout一句评价就是:"上善若水,水善利万物而不争。"...setInterval:我愚蠢的弟弟啊。。肯定是你使用的方法不对! setTimeout:考虑到JS运行环境的特点,你的定时方法可能会连续执行,之间没有预期的间隔。...你是说JS主线程的步同任务执行时间很长,并且异步队列中只有我在往其中添加任务,导致我在异步队列中重复添加的任务没有及时被执行,然后JS主线程空闲后,我添加的多个任务就会连续执行,是吗?...如果你实在需要在这类事件上绑定操作DOM的函数,那么可以考虑一下限制一下事件执行的时间间隔,至少不要那么频繁。至于设置多少时间间隔,看具体场景和需求。...当时想的是,可能是IE反应太慢了,在src属性重置的那个间隔内,没有意识到这一点。于是就尝试加了个setTimeout,把重新设置src的操作丢到了异步任务队列中。

1.6K10

setTimeout的那些事

贯彻此精神的代码,会让整个JS运行环境和谐运行。 给setTimeout一句评价就是:"上善若水,水善利万物而不争。"...setInterval:我愚蠢的弟弟啊。。肯定是你使用的方法不对! setTimeout:考虑到JS运行环境的特点,你的定时方法可能会连续执行,之间没有预期的间隔。...你是说JS主线程的步同任务执行时间很长,并且异步队列中只有我在往其中添加任务,导致我在异步队列中重复添加的任务没有及时被执行,然后JS主线程空闲后,我添加的多个任务就会连续执行,是吗?...如果你实在需要在这类事件上绑定操作DOM的函数,那么可以考虑一下限制一下事件执行的时间间隔,至少不要那么频繁。至于设置多少时间间隔,看具体场景和需求。...当时想的是,可能是IE反应太慢了,在src属性重置的那个间隔内,没有意识到这一点。于是就尝试加了个setTimeout,把重新设置src的操作丢到了异步任务队列中。

2K00

setTimeout和requestAnimationFrame

浏览器内核中线程之间的关系 GUI渲染线程和JS引擎线程互斥 js是可以操作DOM的,如果在修改这些元素的同时渲染页面(js线程和ui线程同时运行),那么渲染线程前后获得的元素数据可能就不一致。...这确保定时器代码加入到队列中的最小时间间隔为指定间隔。...但是,这样会导致两个问题: 1、某些间隔被跳过; 2、多个定时器的代码执行之间的间隔可能比预期的小 假设,某个onclick事件处理程序使用setInterval()设置200ms间隔的定时器。...在下一个间隔,即605ms处,第一个定时器代码仍在运行,同时在队列中已经有一个定时器代码的实例。...在 requestAnimationFrame 之前,主要借助 setTimeout/ setInterval 来编写 JS 动画,而动画的关键在于动画帧之间的时间间隔设置,这个时间间隔设置有讲究,一方面要足够小

1.7K20

关于JavaScript计时器的知识学习

定时器由浏览器实现,在不同浏览器中的实现也会有所不同,Node.js 也实现自己的定时器。 在浏览器中,主计时器函数是 Window 接口的一部分,它具有一些其他函数和对象。...这意味着多个 setTimeout 调用必须使用完全相同的函数。...虽然您可以将 setTimeout 放在循环中,但定时器 API 也提供 setInterval 函数,这将完成永远执行某些操作的要求。...就像 clearTimeout 一样,还有一个 clearInterval 函数,它对 setInerval 调用执行相同的操作,并且还有一个 clearImmediate 也调用同样的操作。...解答 因为延迟量是此挑战中的变量,所以我们不能在这里使用 setInterval ,但我们可以在递归调用中使用 setTimeout 手动创建间隔执行。

1.6K40

【JavaScript基础】Js的定时器(你想看的原理也在哟)

因此实际上,两次执行之间的间隔会小于指定的时间。 比如,setInterval指定每100ms执行一次,每次执行需要5ms,那么第一次执行结束后95毫秒,第二次执行就会开始。...为了确保两次执行之间有固定的间隔,可以不用setInterval,而是每次执行结束后,使用setTimeout指定下一次执行的具体时间。...运行机制 setTimeout和setInterval运行机制是,将指定的代码移出本次执行,等到下一轮Event Loop时,再检查是否到了指定时间。...引擎是单线程,它会强制异步事件排队等待执行; setTimeout和setInterval执行原理是不一样的,需要注意他们的执行时间的影响; 如果一个一次性定时器(setTimeout)被阻塞,它会等待直到有合适的执行时间...(等待时间有可能比它定义的延迟时间长); 如果重复性定时器(setInterval)回调函数执行时间很长(长于定义的间隔时间)的话,间隔定时器有可能无间隔的持续执行。

61530

js中settimeout()的用法详解_低噪放工作原理

但由于JavaScript引擎是单线程的,这就让上述两个定时器的实际执行变得稍微复杂一些。下面我们来看一下两者的运行机制与需要注意的问题。...如对于setTimeout(func, 100, args),js引擎会为func函数设置一个计时器,100毫秒后,将func添加到任务队列等待执行。...setInterval(func, interval, args):设置循环调用。...运行机制 setTimeout setTimeout的运行机制相对简单,即在执行该语句时,设置一个定时器,定时时间置为所设置的延时,当计时结束后,将传入的函数加入任务队列,之后的执行就交给任务队列负责。...此外,对于动画效果来说,我们通常会希望动画运行的更加平滑(也就是希望函数运行得更频繁),这时使用setInterval往往更加流畅,具体请参考之前的文章使用原生js实现简单动画效果。

1.7K20

JavaScript定时器与执行机制详细介绍

JS定时器 JS的定时器目前有三个:setTimeout、setInterval和setImmediate。...使用的时候千万不要太相信预期,延迟的时间严格来说总是大于x毫秒的,至于大多少就要看当时JS的执行情况。 另外,多个定时器如不及时清除(clearTimeout),会存在干扰,使延迟时间更加捉摸不透。...不过不同浏览器的实现不一样,比如,Chrome可以设置1ms,IE11/Edge是4ms。...事实上,setInterval并不管上一次fn的执行结果,而是每隔100ms就将fn放入主线程队列,而两次fn之间具体间隔多久就不一定,跟setTimeout实际延迟时间类似,和JS执行情况有关。...另外可以看出,当setInterval的回调函数执行时间超过了延迟时间,已经完全看不出有时间间隔了。

84010

从setTimeout分析浏览器线程

想说明白js运行机制,不得不提到浏览器内核线程。通常来说,一个浏览器内核的实现至少有三个常驻线程:javascript引擎线程、GUI渲染线程、浏览器事件触发线程。...是JavaScript引擎执行后再设置新的setTimeout定时,理论时间间隔>=10ms;第二段自setInterval设置定时后,定时触发线程会不断的每隔10ms产生异步定时事件并放到任务队列尾,...理论时间间隔<=10ms 案例2 ajax异步请求是否真异步   XMLHttpRequest请求在连接后是异步的,请求是由浏览器新开一个线程,当请求状态变更时,若设置回调函数,异步线程产生状态变更事件放到...那么这两者之间的时间间隔实际上只有5ms。因此,setInterval()并不适合实现精确的按固定间隔的调度操作。...使用这个API可以非常容易的创建在后台运行的线程: var worker = new Worker('*.js'); // 后台线程是不能访问页面或窗口对象的 // 但可通过发送消息和接受消息与后台线程传递数据

1.1K40

Solid.js 就是我理想中的 React

: 精通 React 的人们可能知道发生了什么事情,因为你每天都在与这种问题作斗争:我们创建了太多的间隔(每次重新运行效果时都会创建一个新间隔,也就是每次我们增加 count 时间隔都会增加)。...可以通过几种方式来解决这个问题: 从清除间隔的 useEffect hook 返回一个清理函数 使用 setTimeout 代替 setInterval(还是要使用清理函数) 使用 setCount 的函数形式来避免直接引用当前值...由于依赖数组中没有任何内容,因此我们只创建了一个间隔。由于我们为计数设置器使用了回调函数,因此永远不会在 count 变量上有陈旧闭包。...假的响应性 我思考很多关于 hooks 的事情,想知道为什么它们感觉不太对劲。结果我通过探索 Solid.js 找到了答案。...每次组件渲染时不会设置新的间隔吗? 没有。它就这么正常运行了。 但为什么会这样?好吧,事实证明 Solid 不需要重新运行 Counter 函数来重渲染新的计数。

1.8K50

【今天你更博学了么】一个神奇的前端动画 API requestAnimationFrame

文中贴的 js 代码全都是真实代码,复制即可运行。 怎么玩 我们学习一个东西,肯定是要先看看 MDN 怎么说的。...执行频率 这时候有小伙伴就要问了,我没有像 setTimeout 和 setInterval 那样设置时间,它为什么会间隔执行呢? 再看看文档怎么说。...这回就知道,原来它根本就不用手动设置执行间隔时间,而是根据 浏览器屏幕刷新次数 自动调整了,也就是说浏览器屏幕刷新多少次,它就执行多少次。看到这我只想说一句 厉害坏了 。...在同一个帧中的 多个回调函数 ,它们每一个都会接受到一个 相同的时间戳 ,即使在计算上一个回调函数的工作负载期间已经 消耗一些时间 。...它们的内在运行机制决定 时间间隔参数 实际上只是指定把动画代码添加到 浏览器UI线程队列 中以等待执行的时间。

61820

第46天:setInterval与setTimeout的区别

js的setTimeout方法用处比较多,通常用在页面刷新、延迟执行了等等。今天对js的setTimeout方法做一个系统地总结。...区别 通过上面可以看出,setTimeout和setinterval的最主要区别是: setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束。...如果运行的代码中再次运行同样的setTimeout命令,则可循环运行。...(即 要循环运行,需函数自身再次调用 setTimeout()) 而 setinterval是循环运行的,即每到设定时间间隔就触发指定代码。这是真正的定时器。...setinterval使用简单,而setTimeout则比较灵活,可以随时退出循环,而且可以设置为按不固定的时间间隔运行,比如第一次1秒,第二次2秒,第三次3秒。

94610

你所不知道的setTimeout

其正确答案是,取决于后面同步执行的js需要占用多少时间。 即为:MAX(同步执行的时间, 100);缘何如此,就得看下setTimeout运行机制。...setTimeout和setInterval返回的整数值是连续的(一定环境下,比如浏览器控制台,或者js执行环境等),也就是说,第二个setTimeout方法返回的整数值,将比第一个的整数值大1。...== gid) { clearTimeout(id); } id--; } } })(); 运行上面代码后,实际上再设置任何setTimeout都无效...正确的做法应该是,设置一个门槛值,表示两次Ajax通信的最小间隔时间。如果在设定的时间内,发生新的keydown事件,则不触发Ajax通信,并且重新开始计时。...用法示例 var todoChanges = debounce(batchLog, 1000); Object.observe(models.todo, todoChanges); 现实中,最好不要设置多个

1.7K121

为什么要用 setTimeout 模拟 setInterval

来源:九旬 https://segmentfault.com/a/1190000038829248 在JS 事件循环之宏任务和微任务中讲到过,setInterval 是一个宏任务。...:699 毫秒 // 与原设定的间隔时差:771 毫秒 // 与原设定的间隔时差:887 毫秒 // 与原设定的间隔时差:981 毫秒 // 与原设定的间隔时差:1142 毫秒 // 与原设定的间隔时差...:1822 毫秒 // 与原设定的间隔时差:1891 毫秒 // 与原设定的间隔时差:2001 毫秒 // 与原设定的间隔时差:2748 毫秒 // ......552 毫秒 // 与原设定的间隔时差:563 毫秒 // 与原设定的间隔时差:554 毫秒(2次) // 与原设定的间隔时差:564 毫秒 // 与原设定的间隔时差:602 毫秒 // 与原设定的间隔时差...综上所述,setInterval 有两个缺点: 使用 setInterval 时,某些间隔会被跳过; 可能多个定时器会连续执行; 可以这么理解:每个 setTimeout 产生的任务会直接 push 到任务队列中

1.1K10
领券