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插件实现屏蔽单个元素使用户无法点击
Apr 12 Javascript
jQuery中innerHeight()方法用法实例
Jan 19 Javascript
解析Node.js异常处理中domain模块的使用方法
Feb 16 Javascript
JS实现图片剪裁并预览效果
Aug 12 Javascript
JS中如何实现Laravel的route函数详解
Feb 12 Javascript
vue router-link传参以及参数的使用实例
Nov 10 Javascript
Gulp实现静态网页模块化的方法详解
Jan 09 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
Cocos2d实现刮刮卡效果
Dec 20 Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 Javascript
Webpack中loader打包各种文件的方法实例
Sep 03 Javascript
JS中的变量作用域(console版)
Jul 18 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
php 引用(&)详解
2009/11/20 PHP
奇怪的PHP引用效率问题分析
2012/03/23 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
Python写的英文字符大小写转换代码示例
2015/03/06 Python
使用Python生成url短链接的方法
2015/05/04 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
详解关于Django中ORM数据库迁移的配置
2018/10/08 Python
Python标准库itertools的使用方法
2020/01/17 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
一套比较完整的软件测试人员面试题
2012/05/13 面试题
优秀毕业生事迹材料
2014/02/12 职场文书
金融事务专业求职信
2014/04/25 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
毕业典礼主持词
2015/06/29 职场文书
2015年国培研修感言
2015/08/01 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS