当前位置: 首页 > news >正文

question:setTimeOut的精确调用

setTimeout(fn, delay) 并不能保证回调函数一定会在 delay 毫秒后 “准时” 执行

JavaScript 是单线程的,浏览器中有一个任务队列(Task Queue):

  • 同步代码 → 直接在调用栈执行
  • 微任务(Microtask) → Promise.then、MutationObserver 等,会在同步代码执行完立即执行
  • 宏任务(Macrotask) → setTimeout、setInterval、I/O 回调、UI 渲染回调等,会在下一轮事件循环执行

setTimeout 的工作流程是:

  1. 你调用 setTimeout(fn, 1000),浏览器会在 约 1000ms 后把 fn 推到宏任务队列
  2. 但队列里可能还有其他任务排在前面(比如一个耗时 500ms 的同步操作)
  3. 所以实际执行时间 = 延迟时间 + 前面任务的执行时间

注意:在纯浏览器 JS 环境中,无法绝对保证一个回调在精确的某个毫秒数执行,因为 JS 是单线程的,一旦线程被占用,定时器就会延迟。但是我们可以用一些方法尽量精确!

方法一:使用 requestAnimationFrame(适合动画场景,会在浏览器每一次重绘前执行,通常是 60FPS,约 16ms 一次)

方法二:使用 setTimeout + 修正时间(自校准定时器)

这里注意:Date.now() 的精度是毫秒级,performance.now() 是微秒级(更高精度)

记录上一次执行的时间,计算下一次 “应该” 执行的时间,动态调整延迟。

let startTime = Date.now();
let count = 0;function tick() {count++;let expectedTime = startTime + count * 100; // 每 100ms 一次let realTime = Date.now();console.log('理想时间:', expectedTime, '实际时间:', realTime, '偏差:', realTime - expectedTime);// 下一次延迟 = 理想间隔 - 偏差let delay = Math.max(0, 100 - (realTime - expectedTime));setTimeout(tick, delay);
}tick();

方法三:使用 Web Worker

如果你的 JS 逻辑耗时很长,可以把耗时操作放进 Web Worker,这样主线程就不会被阻塞,setTimeout的那部分逻辑会更准时


但是,浏览器 JS 无法 100% 保证定时精确,因为单线程 + 宏任务队列机制

http://www.dtcms.com/a/412040.html

相关文章:

  • 一般网站建设公司wordpress中文4.8
  • 青岛建设大学招聘信息网站网站运营是做什么的
  • 湖南住房城乡建设厅官方网站房产网站建设
  • 做企业网站用哪个cms哈尔滨模板建站公司
  • 采购寺庙管理软件,技术架构与部署模式很关键
  • 手机制作表白网站html网站建设购物案例
  • Powershell 入门
  • 网站建设一般多少钱一年苏州做网站要多少钱
  • 企业网站能个人备案吗html语言大型网站开发
  • 做服装公司需要什么网站大型 网站的建设 阶段
  • 自己有域名怎么建网站it培训机构培训费用
  • 网站建设虚拟空间东莞软件
  • FC游戏大全(经典+中文+修改版)+高清封面
  • 网站制作咨询莱芜0634技术支持 宿州网站建设
  • Linux驱动:系统分配设备号、杂项设备驱动、编译模块(动态加载)、驱动和设备分离
  • 站长工具seo综合查询引流网站建设一般花多少费用
  • 李继红跪舔坊网站建设南通seo网站价格
  • 梦回童年,将JSNES 游戏模拟器移植到 HarmonyOS 移植指南
  • vue中process.env.NODE_ENV设置方法
  • 数据库造神计划第二十一天---JDBC编程
  • 广州找公司建网站郑州网红打卡地
  • 百度网站托管成都高端网站建设公司哪家好
  • 【STM32H7】QuadSPI读写W25Q64JV
  • 成都青羊网站建设网页升级防问广大
  • Altium Designer 21 (十)DRC验证和设计文件输出
  • dw手机销售网站制作seo 网站制作
  • 【精品资料鉴赏】104页银行核心业务流程梳理和优化方案
  • 磁共振成像原理(理论)13:选层 (Slice Select) -布洛赫方法
  • wordpress 文章新窗口打开专业关键词排名优化软件
  • 【JAVA高级】接口响应慢?用 CompletableFuture 优化。