JS中setTimeout和setInterval的最大延时值详解

发布时间 - 2026-01-10 23:00:59    点击率:

前言

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中一个比较隐蔽的坑了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# setinterval延时  # settimeout延时  # js定时器setinterval  # 实例详解JavaScript中setTimeout函数的执行顺序  # JS ES6中setTimeout函数的执行上下文示例  # JS中SetTimeout和SetInterval使用初探  # js中setTimeout的妙用--防止循环超时  # JavaScript中从setTimeout与setInterval到AJAX异步  # JavaScript计时器用法分析【setTimeout和clearTimeout】  # 详解JS中定时器setInterval和setTImeout的this指向问题  # JavaScript setTimeout与setTimeinterval使用案例详解  # 的是  # 这段  # 值为  # 这是  # 有什么  # 也不  # 更新时间  # 也会  # 相关内容  # 那就  # 设为  # 开了  # 计时器  # 这也  # 这两个  # 朋友们  # 一个月后  # 给大家  # 这篇文章  # 这篇 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  lovemo网页版地址 lovemo官网手机登录  如何利用DOS批处理实现定时关机操作详解  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  制作企业网站建设方案,怎样建设一个公司网站?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  再谈Python中的字符串与字符编码(推荐)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel如何实现数据库事务?(DB Facade示例)  网站制作企业,网站的banner和导航栏是指什么?  浅述节点的创建及常见功能的实现  如何在阿里云通过域名搭建网站?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  微信小程序 input输入框控件详解及实例(多种示例)  如何用IIS7快速搭建并优化网站站点?  Laravel如何处理和验证JSON类型的数据库字段  ,怎么在广州志愿者网站注册?  如何在服务器上配置二级域名建站?  Laravel如何使用Eloquent进行子查询  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  使用Dockerfile构建java web环境  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  详解Android——蓝牙技术 带你实现终端间数据传输  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何用PHP快速搭建CMS系统?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  如何用5美元大硬盘VPS安全高效搭建个人网站?  WEB开发之注册页面验证码倒计时代码的实现  简单实现Android验证码  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么实现验证码(Captcha)功能  java中使用zxing批量生成二维码立牌  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何实现建站之星域名转发设置?  Laravel如何实现本地化和多语言支持?(i18n教程)  使用spring连接及操作mongodb3.0实例  javascript中闭包概念与用法深入理解  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何在IIS7中新建站点?详细步骤解析  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  黑客如何通过漏洞一步步攻陷网站服务器?  JS碰撞运动实现方法详解