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 相关文章推荐
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
Aug 05 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
Oct 18 Javascript
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
Aug 24 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
打字效果动画的4种实现方法(超简单)
Oct 18 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
Oct 11 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
js脚本中执行java后台代码方法解析
Oct 11 Javascript
JS数据类型判断的几种常用方法
Jul 07 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
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php 的反射详解及示例代码
2016/08/25 PHP
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
2016/06/12 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python实现的防DDoS脚本
2011/02/08 Python
零基础学Python(一)Python环境安装
2014/08/20 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
非常详细的C#面试题集
2016/07/13 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
小学少先队活动方案
2014/02/18 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS