首页 > 其他分享 >为什么会出现 setTimeout 倒计时误差

为什么会出现 setTimeout 倒计时误差

时间:2023-06-02 09:56:24浏览次数:48  
标签:误差 定时器 函数 执行 倒计时 setTimeout

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
From: https://www.cnblogs.com/ronaldo9ph/p/17450947.html

相关文章

  • 在统计学和机器学习中,常见的误差类型
    在统计学和机器学习中,常见的误差类型包括以下几种:1.随机误差(RandomError):随机误差是由于测量或观测过程中的不确定性引起的。它是无法避免的,通常表现为测量值或观测值的波动性。随机误差是独立的、不可预测的,并且在多次测量或观测中可以通过取平均值来减小其影响。2.系统误差(S......
  • OnlineDictionary 倒计时体会
     电子辞典终于要结项了,这几天没命写报告,怎么会有这么多报告要写?GOD!有印象的生活是张开眼就开始写报告,画图,写到睡觉。Why theywant somanykindsofreports?真是要人命!  这次的项目,说实话,学到了很多,团队合作,互相体谅,技术学习。这些都是不可言谈的经......
  • WICC · 出海嘉年华|嘉宾就位、话题揭晓,峰会 & 派对报名倒计时
    双厨狂喜!关注【融云全球互联网通信云】了解更多6月2日即将在广州举办的“WICC·社交泛娱乐出海嘉年华”,将是一场集WICC通信行业大会高端峰会规格、前沿技术内容和社交泛娱乐出海务实场景落地、垂直圈子社交于一体的大型盛会。大咖嘉宾、热点话题已经ready,就等你来~Summit......
  • R语言门限误差修正模型(TVECM)参数估计沪深300指数和股指期货指数可视化
    全文链接:http://tecdat.cn/?p=32511原文出处:拓端数据部落公众号时间序列模型的理论已经非常丰富,模型的应用也相当广泛。但现实生活中,越来越多的时间序列模型呈现出了非线性的特点,因此,研究非线性时间序列模型的理论及对其参数进行估计有着极其重要的意义。门限模型作为非线性......
  • 验证码倒计时
    this.countdownTime=null;letsend=60;--send;this.getSmsCodeTip=`${send}s后重新获取`;this.countdownTime=setInterval(()=>{--send;if(send===0){this.getSmsCodeTip='重新获取';send=60;this.isCountDown=true;clearInterval(th......
  • Ext JS 4倒计时:图形和图表
         基本图形功能     一直以来,在Web应用程序中进行绘图是很困难的事情。虽然我们很希望在应用程序中创建丰富的交互式图表或其他图像,但是HTML真的是不是这块料。通常,我们需要使用到AdobeFlash,但这给我们带来了两个难题:我们习惯书写Javascript代码,而且Flash并不是所......
  • Ext JS 4倒计时:开发者预览版
         作为ExtJS团队的代表,我很高兴地宣布第一个ExtJS4开发者预览版发布了。ExtJS4是到目前为止,我们所做的改动最大,有史以来最先进的Javascript框架。从生成HTML代码到类系统,框架的每一个领域几乎都被更新了。我们统一了Api,添加了令人难以置信的新功能和改进了整个框架......
  • 北京.NET线下技术沙龙倒计时一天
    时间:2023年5月20日13:30-18:00地点:北京市海淀区中关村大街32号蓝天科技综合楼一层(中关村智能制造创新中心)(距海淀黄庄地铁站100米)【地下停车场可停车】.NET技术沙龙活动与你不见不散点击链接参加活动:http://hdxu.cn/SUglm活动详情......
  • 展会预热丨2023山东水利博览会倒计时,计讯物联带您精彩抢先看
    和暖的春风渐渐消散,绚烂的夏花渐渐灿烂,一切美好如约而至。第3届山东水利科技与生态建设博览会将于5月18日在青岛•红岛国际会议展览中心隆重召开!作为颇具规模及影响力的水利博览汇聚了全球超300+涉水企业、科研机构参展,推介新技术、新成果,展示新产品、新设备,展览产品涵盖智慧水利......
  • 三周的倒计时
    三周的倒计时曾经高悬于空中的达摩克里斯之剑,将降临在我们每个人头顶上。骑车回家偶遇邱水,她问我,考的如何,我说,你想让我考得如何。别人和我说,毕业典礼要找妹子拍合影,我也想,为这高中生活飘渺虚无的情感结下纪念的回忆,可如今却是更无结果了。在班里玩手机的时间日益增多了,偏向于,......