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 相关文章推荐
实现复选框全选/全不选切换
Dec 23 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
Mar 28 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
Apr 26 Javascript
JS实现商品倒计时实现代码
May 03 Javascript
JS中的log对象获取以及debug的写法介绍
Mar 03 Javascript
JS实现清除指定cookies的方法
Sep 20 Javascript
Javascript实现获取窗口的大小和位置代码分享
Dec 04 Javascript
浅析JavaScript中浏览器的兼容问题
Apr 19 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
VUEX采坑之路之获取不到$store的解决方法
Nov 08 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
php 无极分类(递归)实现代码
2010/01/05 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
Redis构建分布式锁
2017/03/28 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
python处理“
2019/06/10 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
python实现控制台输出彩色字体
2020/04/05 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
2015年幼儿园学前班工作总结
2015/05/18 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技