使用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方块躲避游戏代码

    js方块躲避游戏代码

    鼠标控制,空色方块不要让蓝色方块碰到就可以,看能玩多久,是个javascript不错的一个游戏啊,想用js写游戏的朋友可以参考下,看代码应该是国外的人写的
    2008-05-05
  • Javascript中如何循环(常用方法推荐)

    Javascript中如何循环(常用方法推荐)

    在JavaScript中,遍历集合(如数组、对象、Map和Set等)有多种方式,下面给大家分享几种常用的方法来讲解Javascript中如何循环,感兴趣的朋友一起看看吧
    2025-04-04
  • Js模块打包exports require import的用法和区别

    Js模块打包exports require import的用法和区别

    这篇文章主要介绍了Js模块打包exports require import的用法和区别,对模块打包感兴趣的同学,可以参考下
    2021-05-05
  • 微信小程序个人中心的列表控件实现代码

    微信小程序个人中心的列表控件实现代码

    这篇文章主要介绍了微信小程序个人中心的列表控件实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • JavaScript实现瀑布流布局详解

    JavaScript实现瀑布流布局详解

    这篇文章主要为大家详细介绍了JavaScript瀑布流的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-07-07
  • 取得窗口大小 兼容所有浏览器的js代码

    取得窗口大小 兼容所有浏览器的js代码

    我们首先把window.innerWidth和window.innerHeight的值分别付给了pageWidth和pageHeight。
    2011-08-08
  • p5.js入门教程之键盘交互

    p5.js入门教程之键盘交互

    这篇文章主要介绍了p5.js入门教程之键盘交互,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • JavaScript(JS)和Python之间开发接口(API)示例

    JavaScript(JS)和Python之间开发接口(API)示例

    文章介绍了JavaScript与Python开发接口的两种主流方式:RESTful API和GraphQL API,前者通过HTTP协议使用Express(Node.js)或Flask/Django Rest Framework(Python)构建,后者采用GraphQL语言配合Apollo Server(Node.js)或Graphene(Python)实现
    2025-06-06
  • 用js实现小球的自由移动代码

    用js实现小球的自由移动代码

    本篇文章小编为大家介绍,用js实现小球的自由移动代码。需要的朋友参考下
    2013-04-04
  • js图片下载方式集合(附详细代码)

    js图片下载方式集合(附详细代码)

    关于图片下载问题,不同的浏览器,需要兼容的下载方式,这篇文章主要给大家介绍了关于js图片下载方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01

最新评论