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

使用setTimeout模拟setInterval


const SECOND = 1000
const MINUTE = 60 * SECOND
const HOUR = 60 * MINUTE
const DAY = 24 * HOUR

/**
 * @description: 根据传入的毫秒值格式化为时间
 * @param {*} time:毫秒值
 * @returns:{days, hours, minutes, seconds, milliseconds}
 */
function parseTimeData (time) {
  const days = Math.floor(time / DAY)
  const hours = Math.floor((time % DAY) / HOUR)
  const minutes = Math.floor((time % HOUR) / MINUTE)
  const seconds = Math.floor((time % MINUTE) / SECOND)
  const milliseconds = Math.floor(time % SECOND)
  return {
    days,
    hours,
    minutes,
    seconds,
    milliseconds,
  }
}

/**
  对比两个时间是否在秒级别上相同
*/
function isSameSecond (time1, time2) {
  return Math.floor(time1 / 1000) === Math.floor(time2 / 1000)
}

// 使用setTimeout模拟setInterval
function loop (fn, wait) {
  setTimeout(() => {
    fn()
  }, wait)
}

var timer = null
// 倒计时结束的时间点
var endTime = new Date('2025/4/11 17:00:00').getTime()

// 秒级别倒计时(每1秒执行一次倒计时,默认为毫秒级别的倒计时)
function microTask () {
  timer = loop(() => {
    // 剩余倒计时的毫秒值
    const remain = endTime - Date.now()
    // 判断倒计时是否结束
    if (remain <= 0 || isSameSecond(endTime, Date.now())) {
      clearInterval(timer)
      console.log('倒计时结束了,更新页面');
      return
    }
    microTask()
    const { days, hours, minutes, seconds, milliseconds } = parseTimeData(remain)
    console.log(`${days}天${hours}小时${minutes}分钟${seconds}秒`)
  }, 1000)
}

microTask()

使用setTimeout模拟setInterval的优点:

1、更精确的控制;setInterval存在一定的时间误差,(因为JS是单线程的,当主线程被其他任务占用时,可能导致setInterval的回调函数不能得到及时的执行,从而导致积累误差);但使用setTimeout时,可以在每次回调函数中重新设置setTimeout,这样可以根据上一次回调函数的执行时间来动态调整下一次的执行时间 ,从而减少误差;

2、更好的灵活性,可以在倒计时过程中根据不同的条件来暂停、恢复、取消倒计时;

3、可以动态调整每次倒计时的时间间隔wait,可以在回调函数中每次设置setTimeout时,根据业务需要调整倒计时时间间隔,而setInterval想要调整时间间隔会比较复杂

相关文章:

  • 山东省第二人民医院:基于DeepSeek的医疗AI智慧安全运营应用
  • 河北工程大学e2e平台,python
  • 使用Python写入JSON、XML和YAML数据到Excel文件
  • 高速电路设计概述
  • 代码大模型的发展:通义灵码与KwaiCoder的技术探讨
  • 分布式锁在秒杀场景中的Python实现与CAP权衡
  • 【Delphi】中共享锁实现
  • 腾讯视频安卓版如何开启4K超清画质-提升手机端观影清晰度体验
  • 操作系统 4.2-键盘
  • 论文学习:《利用图注意力网络增强单细胞多组学数据的整合》
  • 无锡东亭无人机培训机构电话
  • 安卓开发提示Android Gradle plugin错误
  • 九科智能流程自动化平台能否适应不同行业的需求?
  • 全球变暖(蓝桥杯 2018 年第九届省赛)
  • 从零开始学java--泛型
  • 倚光科技:以创新之光,雕琢全球领先光学设计公司
  • 【Java集合】LinkedHashSet源码深度分析
  • 理解企业内部信息集成
  • AcWing 166.数独
  • C++基础精讲-04
  • 如何做收款网站/seo查询工具有哪些
  • 做哈尔滨本地门户网站赚钱吗/怎么制作网页广告
  • 更改wordpress小工具的样式/关键词seo服务
  • 网站 托管/搜索引擎营销实训报告
  • 常州网站建设开发/世界500强企业排名
  • 北京大兴专业网站建设公司/今日头条网站推广