setTimeout 倒计时误差的出现主要与 JavaScript 的事件循环机制和计时器的执行方式有关。

在 JavaScript 中,事件循环是用于管理和调度代码执行的机制。setTimeout 函数用于设置一个定时器,在指定的延迟时间后执行回调函数。然而,由于事件循环的机制,setTimeout 并不能保证在准确的时间间隔后执行回调函数,而是将回调函数插入到事件队列中,等待当前代码执行完毕后再执行。

因此,setTimeout 的倒计时误差可能会受到以下因素的影响:

1. 延迟执行:setTimeout 设置的延迟时间并不是精确的时间点,而是一个最小延迟时间。如果事件循环中有其他代码正在执行,setTimeout 的回调函数可能会被推迟执行。
2. 系统负载:当系统负载较重时,事件循环可能会出现延迟。这可能导致 setTimeout 的回调函数执行的时间比预期的要晚。
3. 睡眠模式:在某些设备上,当设备进入睡眠模式时,定时器可能会暂停,直到设备被唤醒。这会导致 setTimeout 的回调函数执行时间延迟。

为了减少 setTimeout 倒计时误差,可以考虑以下方法:

1. 使用精确计时库:可以使用像 setInterval 或 requestAnimationFrame 这样的精确计时机制来实现准确的定时任务。
2. 手动调整:在每次定时器触发后,通过记录实际执行时间并与预期执行时间进行比较,计算误差并进行手动调整,以纠正误差。
3. 使用 Web Workers:将计时任务移至 Web Workers 中执行,这样可以避免与主线程的其他代码竞争,提高定时器的准确性。
4. 使用时间戳:而不是依赖定时器的延迟时间,使用时间戳来进行倒计时和计算,可以更精确地控制时间。

以下是一个使用高精度时间戳的示例,用于减少 setTimeout 倒计时误差:

function countdown(duration, callback) {
const startTime = performance.now(); function tick() {
const currentTime = performance.now();
const elapsedTime = currentTime - startTime;
const remainingTime = duration - elapsedTime; if (remainingTime <= 0) {
callback();
} else {
setTimeout(tick, Math.max(0, remainingTime));
}
} tick();
} // 使用示例
const duration = 6000; // 倒计时时长为6秒 countdown(duration, () => {
console.log("倒计时结束");
});

在这个示例中,使用 performance.now() 方法获取高精度的时间戳。在每次定时器触发时,计算实际经过的时间(elapsedTime),然后计算剩余时间(remainingTime)。如果剩余时间小于等于0,则调用回调函数表示倒计时结束;否则,使用 setTimeout 函数设置下一个定时器来继续执行倒计时。

通过使用高精度时间戳,可以减少定时器的误差,提高倒计时的准确性。

需要注意的是,尽管可以采取上述措施减少倒计时误差,但由于 JavaScript 的事件循环机制的限制,完全消除误差是不可行的。因此,在编写倒计时相关的代码时,应该合理预估和处理可能的误差,并根据具体需求选择适当的解决方案。

为什么会出现 setTimeout 倒计时误差的更多相关文章

  1. setTimeout 倒计时

    <script type="text/javascript"> //设定倒数秒数 var t = 10; //显示倒数秒数 function showTime(){ t ...

  2. 前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)

    写在前面 参考答案及资源在看云平台发布,如果大家想领取资源以及查看答案,可直接前去购买.一次购买永久可看,文档长期更新!有什么意见与建议欢迎您及时联系作者或留言回复! 文档描述 本文是关注微信小程序的 ...

  3. 【Step-By-Step】第 三 周

    本周面试题一览: 什么是XSS攻击,XSS 攻击可以分为哪几类?我们如何防范XSS攻击? 如何隐藏页面中的某个元素? 浏览器事件代理机制的原理是什么? setTimeout 倒计时为什么会出现误差? ...

  4. uni-app app端 人脸识别

    在听到人脸识别,哇塞!感觉来个个高大上的,去阿里 腾讯 看他们的人脸识别方法,官方sdk什么的. 到后来,需求确定了,拍照(照片)上传,后台去识别是不是本人,这一瞬间从天堂到地狱,放着官方那么好的方法 ...

  5. setTimeout/setInterval,属性、连续动画、倒计时的分析

    setTimeout.setInterval环境应用和使用场景 说明:setTimeout属于超时调用, setInterval 属于间隔调用 1,setTimeout超时的使用介绍: var set ...

  6. setTimeout和setInterval的区别以及如何写出效率高的倒计时

    1.setTimeout和setInterval都属于js中的定时器,可以规定延迟时间再执行某个操作,不同的是setTimeout在规定时间后执行完某个操作就停止了,而setInterval则可以一直 ...

  7. js点击按钮倒计时setTimeout和setInterval

    setTimeout() 用于在指定的毫秒数后调用函数或计算表达式,只执行 code 一次. setInterval() 可按照指定的周期(以毫秒计)来调用函数或计算表达式,不停地调用函数,直到 cl ...

  8. js倒计时功能

    <input id="countdown" type="text" value="140时50分20秒"> <script ...

  9. JS简单的倒计时(代码优化)

    倒计时网上一大堆,所以也没有什么好说的,支持:1.年,月,日,天,时分秒等倒计时. JS代码如下: /* * js简单的倒计时 * @param {date,obj} 日期 对象格式 */ funct ...

  10. 【微信小程序】使用setTimeout制作定时器的思路

    setTimeout(func, time)可以使得每隔time毫秒就执行一次func函数,常用来做计时器/时钟. 下面是在微信小程序中的使用思路,只截取了关键部分代码. var timer; // ...

随机推荐

  1. 基于深度学习的车型识别系统(Python+清新界面+数据集)

    摘要:基于深度学习的车型识别系统用于识别不同类型的车辆,应用YOLO V5算法根据不同尺寸大小区分和检测车辆,并统计各类型数量以辅助智能交通管理.本文详细介绍车型识别系统,在介绍算法原理的同时,给出P ...

  2. SpringBoot——国际化

    更多内容,前往IT-BLOG 一.Spring 编写国际化时的步骤 [1]编写国际化配置文件:[2]使用 ResourceBundleMessageSource 管理国际化资源文件:[3]在页面使用 ...

  3. 寻找区间内第k小的数

    sort排序 这是最直接暴力的方法,时间复杂度为\(O(nlog_n)\) 直接排序,输出第k小的值即可 #include <iostream> #include <algorith ...

  4. 【责任链设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    简介 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,也叫职责链模式.命令链模式.这种模式为请求创建了一个接收者对象的链,允许你将请求沿着处理者链进行 ...

  5. 软件开发定律:海勒姆定律(Hyrum's Law)

    hi,我是熵减,见字如面. 在软件开发中,你是否遇到过这种情况: 你正在开发一个购物车的功能,需要在用户添加商品到购物车时,将商品的信息存储到数据库中.你设计了一个简单的方法,如下所示: public ...

  6. [整理] FFmpeg官方文档树

    扫了一遍官方文档,整理张官文树. 当然还有很多细节,可以慢慢沿着树根填,有需要可以联系我要ProcessON源文件,我尽量给个最新的出来. 官文 : http://ffmpeg.org/documen ...

  7. 【踩坑系列】发送微信模板消息返回40165 invalid weapp pagepath

    1. 踩坑经历 最近做了个需求,需要往公司微信公众号推送一个模板消息,并且点击该消息需要跳转到公司小程序的某个页面. 1.1 拿到模板id 既然是发送模板消息,第一步就需要登录微信公众号后台新建模板消 ...

  8. 6步带你用Spring Boot开发出商城高并发秒杀系统

    摘要:本博客将介绍如何使用 Spring Boot 实现一个简单的商城秒杀系统,并通过使用 Redis 和 MySQL 来增强其性能和可靠性. 本文分享自华为云社区<Spring Boot实现商 ...

  9. [Java SE]Java版本特性解读:java.util.Optional [JDK1.8-]

    1 概述 本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空(null/empty). Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范 ...

  10. Spring @Profile注解使用和源码解析

    介绍 在之前的文章中,写了一篇使用Spring @Profile实现开发环境,测试环境,生产环境的切换,之前的文章是使用SpringBoot项目搭建,实现了不同环境数据源的切换,在我们实际开发中,会分 ...