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 相关文章推荐
JavaScript使用cookie
Feb 02 Javascript
关于javascript中的typeof和instanceof介绍
Dec 04 Javascript
js中数组(Array)的排序(sort)注意事项说明
Jan 24 Javascript
不使用ajax实现无刷新提交表单
Dec 21 Javascript
Javascript 计算字符串在localStorage中所占字节数
Oct 21 Javascript
JS百度地图搜索悬浮窗功能
Jan 12 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
Apr 22 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
Apr 23 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
Vue插值、表达式、分隔符、指令知识小结
Oct 12 Javascript
vue 中url 链接左边的小图标更改问题
Dec 30 Javascript
详解Vue3使用axios的配置教程
Apr 29 Vue.js
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
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
Python的动态重新封装的教程
2015/04/11 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python实现排序算法解析
2018/09/08 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python打开文件的方式有哪些
2020/06/29 Python
python实现图像外边界跟踪操作
2020/07/13 Python
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
教师产假请假条
2014/04/10 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
2014年项目工作总结
2014/11/24 职场文书
爱国主义影片观后感
2015/06/18 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫