时间:2021-05-26
前言
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中一个比较隐蔽的坑了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
JS里设定延时:使用SetInterval和设定延时函数setTimeout很类似。setTimeout运用在延迟一段时间,再进行某项操作。setTimeout
定义setTimeout()和setInterval()经常被用来处理延时和定时任务。setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式,而s
计时器setTimeout()和setInterval()两个都是js的计时功能的函数两个有些区别。setTimeout():在js手册中的解释:用于在指定的毫
在js中,延迟执行函数有两种,setTimeout和setInterval,用法如下:functiontestFunction(){Console.log('h
setTimeout、setInterval的使用 Javascriptapi文档中定义setTimeout和setInterval第二个参数意义分别为间隔多