setTimeout还是setTimeInterval?

setTimeout还是setTimeInterval?目录参数及介绍 setTimeOutse 工作原理前言 JS 是单线程运行的 setTimeOutse 情况一 fn 运行时间 时间间隔 即多数情况情况二 fn 运行时间 gt 时间间隔 即一些异常情况 setTimeOut 弥补 setInterval 的不足本文参考文章参数及介绍 setTimeOutse fn delayTime 功能 在一定时间延迟之后开始执行一个给定的函数 参数 1 fn 将要执行的函数 函数类型或者字符串类型 参数 2

一、参数及介绍

setTimeOut

setTimeOut (fn, delayTime) 

setInterval

setInterval (fn, interval) 

二、工作原理

前言:JS是单线程运行的

setTimeOut

【工作原理】

  • JS是单线程执行,当执行到setTimeOut代码时开始计时,在当到达间隔时间delayTime 之后,把回调函数fn放到事件队列
  • 真正的运行时间取决于主线程何时调用事件队列中fn。(当主线程空闲下来才会去事件队列取出fn函数执行)

运行到 setTimeOut(时间点)| delayTime(时间段) | 调用函数fn(时间点)| fn执行时段(时间段)

setInterval

  • 如果没有,则将 fn 加入到事件队列中
  • 如果有,那么不会将回调函数 fn 加入到事件队列中,防止之后连续调用 fn(即非定时调用)
    弊端:导致一些间隔被跳过

情况一:fn运行时间 ≤ 时间间隔 ,即多数情况

Mon 06 Mon 13 Mon 20 fn运行时间 时间间隔 fn运行时间 时间间隔 fn运行时间 时间间隔 时间线

情况二:fn运行时间 > 时间间隔 ,即一些异常情况

Mon 06 Mon 13 Mon 20 fn运行时间 时间间隔 fn运行时间 时间间隔 fn运行时间 时间间隔 时间线

为什么会这样?

  • JS 为单线程,在一个时间段内全力只作一件事。即执行函数 fn。
  • 在 fn 运行的时,定时器没有能力终止其的运行
  • fn运行时间 > 时间间隔 interval 时,间隔时间到了,但是程序还没有执行完,那也要老老实实的等着函数执行完。

弊端?

  • 实际间隔是fn运行的时间,并非设定的时间间隔 interval,时间不精确。

三、setTimeOut弥补setInterval的不足

setTimeout(function fn(){ 
    // 1. 业务逻辑 console.log('Hi') // 2. 链式调用  setTimeout(fn, interval); }, interval); 
  • 链式调用 setTimeout()
  • 每次函数执行的时候都会创建一个新的定时器。
  • 第二个setTimeout()调用当前执行的函数,并为其设置另外一个定时器。
  • 这样做的好处是,在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔。
  • 而且,它可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。

四、本文参考文章

排名不分先后

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203942.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:14
下一篇 2026年3月19日 下午9:14


相关推荐

  • 史上超强最常用SQL语句大全

    史上超强最常用SQL语句大全史上超强最常用SQL语句大全,)1)DDL–数据定义语言用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等2)DML–数据操作语言用来对数据库中表的数据进行增删改。关键字:insert,delete,update等3)DQL–数据查询语言用来查询数据库中表的记录(数据)。关键字:selewhere等4)DCL–数据控制语言用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等

    2022年6月14日
    23
  • Python注释以及快捷键「建议收藏」

    Python注释以及快捷键「建议收藏」1、单行注释单行注释是#Mac的快捷键是command+/windows的快捷键是Ctrl+/2、多行注释多行注释是三个单引号'''注释'&#39

    2022年8月2日
    7
  • Burpsuite 抓包

    Burpsuite 抓包打开火狐设置代理1、在火狐“常规”里设置手动代理,在http代理输入:127.0.0.1端口80802、输入用户和密码–>打开抓包模块–>点击登录3、抓包成功:可以在Burpsuite里查看请求包里的用户和密码4、改包:我们可以在Burpsuite里修改这两个数据为任意内容,然后放走。请求包就会带着我们修改后的数据到达服务器5、放包:一直forwoard放走,直到网页返回响应的内容。因为后台可能不止开了一个窗口的原因,所以也会抓到其…

    2022年6月2日
    47
  • HLS 直播协议m3u8详解

    HLS 直播协议m3u8详解一 HLS 是什么 HTTPLiveStre 缩写是 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议 是苹果公司 QuickTimeX 和 iPhone 软件系统的一部分 它的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载 每次只下载一些 当媒体流正在播放时 客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源 允许流媒体会话适应不同的数据速率 在开

    2026年3月19日
    2
  • Pytest(6)重复运行用例pytest-repeat[通俗易懂]

    Pytest(6)重复运行用例pytest-repeat[通俗易懂]前言平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,

    2022年7月30日
    6
  • mybatis嵌套查询的使用[通俗易懂]

    mybatis嵌套查询的使用[通俗易懂]当我们遇到表与表之之间存在关联的时候,就可以使用mybatis的嵌套查询比如说当一个对象包含了另一个对象/***公交实体类中包含了司机信息和路线信息*/publicclassBusimplementsSerializable{privateIntegerid;privateStringcard;privateIntegerd…

    2022年8月30日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号