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碰撞运动实现方法详解

