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简单体验
Jan 10 Javascript
javascript变量作用域使用中常见错误总结
Mar 26 Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 Javascript
jQuery实现的向下图文信息滚动效果
May 03 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
iframe跨域通信封装详解
Aug 11 Javascript
js学习之----深入理解闭包
Nov 21 Javascript
js实现微博发布小功能
Jan 12 Javascript
vue.js学习之UI组件开发教程
Jul 03 Javascript
JQuery EasyUI的一些常用组件
Jul 12 jQuery
BetterScroll 在移动端滚动场景的应用
Sep 18 Javascript
浅谈angular4实际项目搭建总结
Dec 01 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
15种PHP Encoder的比较
2007/04/17 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
2016/11/09 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
Python中动态创建类实例的方法
2017/03/24 Python
python学生管理系统
2019/01/30 Python
python使用minimax算法实现五子棋
2019/07/29 Python
windows下python安装pip方法详解
2020/02/10 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
人力资源管理专业应届生求职信
2013/09/28 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
小学教师评语大全
2014/04/23 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
学习党代会心得体会
2014/09/05 职场文书
毕业生实习证明
2014/09/19 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
北京英语导游词
2015/02/12 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫