使用setTimeout实现SetInterval原理解析

 更新时间:2023年10月29日 08:46:06   作者:Tqing  
这篇文章主要为大家介绍了使用setTimeout实现SetInterval原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

为什么要使用setTimeout来实现SetInterval?

我们知道setInterval以一定频率来执行一个函数,但是这样有一个问题,加入执行的这个函数相当耗时,超过了我们给定的周期时间,setInterval还会按照约定的时间来执行下次任务吗?

答案是不会,setInterval会等到当前的任务执行完成后,再立即执行下一次的任务,看个例子

setInterval(function interval() {
  for(let i = 0; i < 10000000000; i++);
  console.log('done')
}, 1000)

打印语句出现的时间会超过1s,那么第2s的打印操作也会随着被推迟。参考下图,setInterval每次的时间间隔是从任务开始时间开始算的,尽量与下一次任务的开始执行时间间隔和给定的时间间隔相同,一旦任务的执行时间超过了给定的时间间隔,那么下一次任务会被推迟,下次任务会在本次任务结束后来执行。

如何使用setTimeout来模拟setInterval?

借助与递归的思路,在上次任务结束后,立即安排下次任务的执行,这样保证上一个任务的结束时间到下一个任务的开始时间和给定时间是相等的

function setInterval2(fn, ms, ...args) {
  let timeId = null
  function tick() {
    timeId = setTimeout(() => {
      fn(...args)
      tick()
    }, ms)
  }
  fn(...args)
  tick()
  return () => clearTimeout(timeId)
}
function setInterval3(fn, ms, ...args) {
  fn(...args)
  let timeId = setTimeout(function tick() {
    fn(...args)
    timeId = setTimeout(tick, ms)
  }, ms)
  return () => clearTimeout(timeId) // 方便随时取消
}

以上就是使用setTimeout实现SetInterval原理解析的详细内容,更多关于setTimeout来实现SetInterval的资料请关注脚本之家其它相关文章!

相关文章

  • js将网址转为urlencode类型

    js将网址转为urlencode类型

    网址urlencode加密函数,主要用于中文目录
    2008-06-06
  • layui导航栏二级菜单不显示问题及解决

    layui导航栏二级菜单不显示问题及解决

    这篇文章主要介绍了layui导航栏二级菜单不显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • JS获取字符串实际长度(包含汉字)的简单方法

    JS获取字符串实际长度(包含汉字)的简单方法

    下面小编就为大家带来一篇JS获取字符串实际长度(包含汉字)的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • JavaScript中实现数组分组功能的方法详解

    JavaScript中实现数组分组功能的方法详解

    最近,JavaScript引入了一个备受期待的功能:原生支持数组分组,这一特性使得在处理复杂的数据集时变得更加简单和高效,本文将深入探讨这一全新的JavaScript特性,希望对大家有所帮助
    2023-12-12
  • Javascript实现鼠标右键特色菜单

    Javascript实现鼠标右键特色菜单

    鼠标右键大家都经常操作,但是鼠标的内容是不是符合大家的“口味”?这篇文章就是教大家如何定制自己专属鼠标右键,需要的朋友可以参考下
    2015-08-08
  • js实现图片实时时钟

    js实现图片实时时钟

    这篇文章主要为大家详细介绍了js实现图片实时时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • 与ClientWidth有关的一点资料

    与ClientWidth有关的一点资料

    与ClientWidth有关的一点资料...
    2006-08-08
  • JS实现前端页面的搜索功能

    JS实现前端页面的搜索功能

    这篇文章主要介绍了JS实现前端页面的搜索功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-06-06
  • JavaScript实现动态网页飘落的雪花

    JavaScript实现动态网页飘落的雪花

    这篇文章主要为大家详细介绍了JavaScript实现动态网页飘落的雪花,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • JSONP跨域模拟百度搜索

    JSONP跨域模拟百度搜索

    这篇文章主要介绍了JSONP跨域模拟百度搜索,JSONP是JSON with padding 的简写,应用JSON的一种新方法,在后来的Web服务中非常流行,JSONP看起来与JSON差不多,只不过是被包含在函数中调用的JSON,对此感兴趣的小伙伴可以参考一下下面文章内容
    2021-12-12

最新评论