当前位置: 移动技术网 > IT编程>开发语言>JavaScript > JS中setTimeout和setInterval的最大延时值详解

JS中setTimeout和setInterval的最大延时值详解

2019年03月26日  | 移动技术网IT编程  | 我要评论
前言 javascript提供定时执行代码的功能,叫做定时器(timer),主要由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中一个比较隐蔽的坑了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网