news 2026/6/3 23:04:55

前端如何实现一个高精准定时器和延时器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端如何实现一个高精准定时器和延时器

一、为什么浏览器定时器不精准?

1️⃣ JS 是单线程

  • 主线程被占用 → 定时器回调延迟

  • UI / 渲染 / GC 都会阻塞


2️⃣ 浏览器最小时间精度限制

  • HTML5 规范限制(4ms)

  • 后台 Tab 被强制降频(1000ms+)


3️⃣ setInterval 的“时间漂移”

setInterval(fn, 1000); // 实际执行时间 = 1000 + fn执行时间

👉时间会越来越不准


二、高精准定时器的核心思想(先记住)

不用“执行次数”计时,而用“时间戳”对齐真实时间。


三、高精准延时器(setTimeout 替代方案)⭐

实现:时间戳校正法

function preciseTimeout(fn, delay) { const start = performance.now(); function loop() { const now = performance.now(); if (now - start >= delay) { fn(); } else { requestAnimationFrame(loop); } } loop(); }

为什么准?

  • 使用高精度时钟performance.now()

  • 每帧校正误差


四、高精准定时器(setInterval 替代方案)⭐⭐

实现:递归 setTimeout + 时间修正

function preciseInterval(fn, interval) { let expected = performance.now() + interval; function step() { const drift = performance.now() - expected; fn(); expected += interval; setTimeout(step, Math.max(0, interval - drift)); } setTimeout(step, interval); }

核心点

  • 不是简单等待 interval

  • 每次都修正漂移


五、Web Worker 定时器(更准)🚀

为什么 Worker 更准?

  • 不阻塞 UI 线程

  • 不受页面渲染影响


worker.js

setInterval(() => { postMessage(Date.now()); }, 1000);

主线程

const worker = new Worker('worker.js'); worker.onmessage = () => { console.log('tick'); };

👉计时类、音频、监控系统首选


六、requestAnimationFrame 方案(适合动画)

let last = performance.now(); function rafTimer() { const now = performance.now(); if (now - last >= 1000) { console.log('tick'); last = now; } requestAnimationFrame(rafTimer); } rafTimer();

七、三种方案对比(面试必背)

方案精度适合场景
setTimeout普通任务
时间校正业务定时
Web Worker很高长期计时
RAF动画 / UI

八、延时器 vs 定时器(概念区分)

类型特点
延时器执行一次
定时器周期执行
高精准基于时间差

九、后台 / 锁屏问题(高级)

问题

  • 浏览器后台 Tab 会降频

解决方案

  • Web Worker

  • Visibility API + 校正

  • 服务端时间对齐


十、30 秒面试标准回答(直接背)

浏览器原生定时器会因主线程阻塞产生时间漂移;
高精准定时器应基于时间戳校正,而不是固定间隔;
可以通过递归 setTimeout、requestAnimationFrame 或 Web Worker 提升精度;
对精度要求极高的场景应使用 Worker 或服务端时间同步。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 6:57:30

Qwen3-4B-Instruct部署教程:支持256K上下文的完整指南

Qwen3-4B-Instruct部署教程:支持256K上下文的完整指南 1. 模型简介:Qwen3-4B-Instruct-2507 是什么? 1.1 阿里开源的新一代文本生成模型 Qwen3-4B-Instruct-2507 是阿里云推出的一款高性能、轻量级大语言模型,属于通义千问系列…

作者头像 李华
网站建设 2026/5/20 9:38:14

Qwen3-1.7B离线语音助手搭建全过程

Qwen3-1.7B离线语音助手搭建全过程 你是否想过,不依赖网络、不上传隐私、不调用云端API,就能在本地电脑上运行一个真正“听懂你说话、还能开口回答”的AI语音助手?不是概念演示,不是简化Demo,而是能稳定工作、响应自然…

作者头像 李华
网站建设 2026/6/2 20:14:18

Qwen_Image_Cute_Animal_For_Kids省钱实战:免费镜像+按需GPU计费

Qwen_Image_Cute_Animal_For_Kids省钱实战:免费镜像按需GPU计费 你是不是也经常为给孩子做手工课件、绘本插图或者生日派对素材而发愁?找图版权贵,画图又没时间。现在,有个好消息——Qwen_Image_Cute_Animal_For_Kids 镜像来了&a…

作者头像 李华
网站建设 2026/5/30 14:18:57

Deepseek问答:从人事物方面准备年终述职

好的,这是一个非常棒的述职准备思路。从 人、事、物 三个维度进行系统梳理,能确保总结全面、结构清晰、重点突出。 以下为您列举了尽可能详细的问题清单,您可以根据自己的岗位职责进行选择和深化。 第一部分:关于“人” &#xf…

作者头像 李华
网站建设 2026/5/29 17:14:06

麦橘超然扩展功能推荐:支持LoRA模型加载的方法

麦橘超然扩展功能推荐:支持LoRA模型加载的方法 1. 什么是麦橘超然?一个轻量但强大的Flux图像生成控制台 麦橘超然不是另一个需要折腾配置的命令行工具,而是一个开箱即用的离线图像生成控制台。它基于 DiffSynth-Studio 构建,专为…

作者头像 李华
网站建设 2026/5/21 7:49:05

用fft npainting lama清除照片涂鸦,效果干净利落

用fft npainting lama清除照片涂鸦,效果干净利落 1. 引言:让图像修复变得简单高效 你有没有遇到过这样的情况?一张珍贵的老照片上被人乱涂乱画,或者截图里有不想保留的水印、文字,甚至是一些碍眼的小物体。传统修图方…

作者头像 李华