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


Posted in Javascript onFebruary 13, 2017

前言

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 相关文章推荐
基于Jquery的跨域传输数据(JSONP)
Mar 10 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
Jul 01 Javascript
浅析vue数据绑定
Jan 17 Javascript
canvas时钟效果
Feb 16 Javascript
JavaScript变量作用域_动力节点Java学院整理
Jun 27 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
JS实现判断有效的数独算法示例
Feb 25 Javascript
Vue Router中应用中间件的方法
Aug 06 Javascript
Vue.js实现简单动态数据处理
Feb 13 #Javascript
JavaScript获取select中text值的方法
Feb 13 #Javascript
详谈$.data()的用法和作用
Feb 13 #Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
Feb 13 #Javascript
JavaScript实现公历转农历功能示例
Feb 13 #Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 #Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 #Javascript
You might like
是否存在第一台收音机的说法
2021/03/01 无线电
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
建立动态的WML站点(一)
2006/10/09 PHP
PHP Stream_*系列函数
2010/08/01 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
DHTML Slide Show script图片轮换
2008/03/03 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
Javascript函数中的arguments.callee用法实例分析
2016/09/16 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
暑假社会实践证明格式
2014/10/28 职场文书
借款民事起诉状范文
2015/05/19 职场文书
暂住证证明
2015/06/19 职场文书