JS中setTimeout和setInterval的最大延时值详解
前言
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()
和setInterval()
这两个函数来完成。而这篇文中主要给大家介绍的是关于JS中setTimeout和setInterval最大延时值的相关问题,需要的朋友们下面来一起学习学习吧。
先来看这样一段代码:
function update() { loadData().then(function(data) { $('#content').html(data.content); var delay = data.nextUpdateTime - new Date(); if (delay > 0) { setTimeout(update, delay); } }); }
其流程非常简单:通过AJAX加载数据后更新HTML的内容;如果有指定下次更新时间,则通过计时器在该时间点再执行一次整个流程。
要说这段代码有什么隐患的话,那就是data.nextUpdateTime
与当前时间的时间差(即delay变量的值)比较小的时候,会导致内容频繁更新。但这是属于正常的业务逻辑,要优化就只能牺牲内容更新的即时性。然而这里我要说的是,当时间差非常大的时候,也会出现同样的问题。
下面模拟一下这个场景:
function log() { console.log('executed'); } var nextUpdateTime = new Date(); // 设为一个月后 nextUpdateTime.setMonth(nextUpdateTime.getMonth() + 1); var delay = nextUpdateTime - new Date(); setTimeout(log, delay);
这段代码的原意是让log函数在一个月后执行,但是运行一下就可以发现,该函数会马上执行。为什么会这样呢?
搜一下相关内容可以发现,setTimeout是使用Int32来存储延时参数值的,也就是说最大的延时值是2^31-1。一旦超过了最大值,其效果就跟延时值为0的情况一样,也就是马上执行。
这个最大的延时值已经接近一个月了,一般情况下,用户也不会长时间开着一个网页,如果真开了这么久,那就刷新一下吧:
function update() { loadData().then(function(data) { $('#content').html(data.content); var delay = data.nextUpdateTime - new Date(); if (delay > 0) { // 限制最大延时值为一天 var ONE_DAY = 24 * 60 * 60 * 1000; if (delay > ONE_DAY) { setTimeout(function() { window.location.reload(); }, ONE_DAY); } else { setTimeout(update, delay); } } }); }
同样的问题也存在于setInterval中。这也算是Javascript中一个比较隐蔽的坑了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
相关文章
JavaScript学习笔记整理_setTimeout的应用
下面小编就为大家带来一篇JavaScript学习笔记整理_setTimeout的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-03JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
这篇文章主要介绍了JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法,涉及JavaScript页面元素定时滚动操作及ajax调用实现技巧,需要的朋友可以参考下...2016-04-19- 这篇文章主要介绍了React中使用setInterval函数的实例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06
浅谈vue 组件中的setInterval方法和window的不同
这篇文章主要介绍了浅谈vue 组件中的setInterval方法和window的不同,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30vue 解决setTimeOut和setInterval函数无效报错的问题
这篇文章主要介绍了vue 解决setTimeOut和setInterval函数无效报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30- 这篇文章主要为大家详细介绍了JS使用setInterval计时器实现挑战10秒,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-08
- 这篇文章主要介绍了解决js中的setInterval清空定时器不管用问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-18
JS中setTimeout和setInterval的最大延时值详解
这篇文章主要介绍了JS中setTimeout和setInterval的最大延时值的相关资料,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。...2017-02-19理解javascript定时器中的setTimeout与setInterval
这篇文章主要帮助大家学习理解javascript定时器中的setTimeout与setInterval,从实例出发进行深入探讨,感兴趣的小伙伴们可以参考一下...2016-02-26BOM系列第一篇之定时器setTimeout和setInterval
这篇文章主要介绍了BOM系列第一篇之定时器setTimeout和setInterval 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-08-24- 这篇文章主要介绍了vue setInterval 定时器失效的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
JavaScript中从setTimeout与setInterval到AJAX异步
这篇文章主要介绍了JavaScript中从setTimeout与setInterval到AJAX异步,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2017-02-19- Javascript中的SetTimeout和SetInterval函数很方便,把他们移植到c#中来。...2020-06-25
- 下面小编就为大家带来一篇PHP页面跳转实现延时跳转的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-01-08
JavaScript中setTimeout和setInterval函数的传参及调用
这篇文章主要介绍了JavaScript中setTimeout和setInterval函数的传参及调用,着两个函数可以把要执行的代码在设定的一个时间点插入js引擎维护的一个代码队列中,需要的朋友可以参考下...2016-03-12JavaScript setTimeout和setInterval的用法与区别详解
Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,下面这篇文章主要给大家介绍了关于JavaScript setTimeout和setInterval的用法与区别,需要的朋友可以参考下...2022-04-20