setInterval和setTimeout的缺陷和优势分析

2023-05-16

先把问题摆出来:
使用定时器的setInterval()方法会出现程序并不是按照我们设定的精确时间而调用的问题!


定时器:

在JavaScript中经常会使用定时器来进行延时或者是重复调用的操作;定时器有两个方法:
1:setInterval(参数1,参数2)
参数1:要执行的代码,可以为function();
参数2:间隔时间 单位ms;
执行无限次直到取消定时器。

2:setTimeout(参数1,参数2)
参数1:要执行的代码,可以为function();
参数2:延迟时间 单位ms;
执行一次。

注意区分:setInterval()的参数2是间隔时间,setTimeout()的参数2是延迟时间
这一段将是接下来进行二者详细区分的重要根据;


一:setInterval() 辉煌下隐藏的破败##

实例1

 var num = 0;
    var test1 =  setInterval(function (){
        num++;
        var data = new Date();
        var str = data.getHours() + ":" + data.getMinutes() + ":" + data.getSeconds() + ":" + data.getMilliseconds();
        console.log(str);
        if (num > 5) {
            clearInterval(test1);
        }
    },1000);

这里写图片描述
1:代码;程序设置定时器每1秒执行一次,当执行次数为六次时消掉计数器;
2:从运行结果上来看,在精确到毫秒之后就有些许的波动;
实例2

 var num2 = 0;
    var test2 = setInterval(function(){
        num2++;
        for(var i = 0;i < 500000;i++){
            var div = document.createElement("div");
            var container = document.getElementById("d1");
            container.appendChild(div);
        }
        var data = new Date();
        var str = data.getHours() + ":" + data.getMinutes() + ":" + data.getSeconds() + ":" + data.getMilliseconds();
        console.log(str);
        if(num2 > 5){
            clearInterval(test2);
        }
    },1000);

这里写图片描述
1:代码描述:定时器中有一个50万次的循环,创建和追加div元素这个操作是非常耗费性能的,运行一次我这破机子瞬间不好了;执行完一次for循环之后就输出一次当前的时间,运行六次就消除定时器。
2:执行结果:如图所示每一次执行定时器的操作的时间相差分别是7,9,9,12,13秒,
哎!!定义的不是每一秒执行一次吗?为什么出现相差 这么多秒!!!!???
此时请出在开头亮出来的问题:
setInterval()方法会出现程序并不是按照我们设定的精确时间而调用的问题!!!
这是为什么?我设置了程序调用时间为什么又不按照我说的办了??

简单地画了个图,描述一下程序的执行时间为什么会产生错乱。
图一:
这里写图片描述
这张图描述的是当A <= B时的调用状况。此时程序每一次的执行根本就不会影响到定时器设置的间隔调用;所以此时会产生实例1中输出的时间是严格按照我们所设定的精确时间进行调用;

图二:
这里写图片描述
曾经我以为使用定时器的函数,只要到达了设置的间隔时间,即使他没有执行完也会被定时器强行的从栈中扯出来从头开始执行,这样从头到尾就没有一次是完整的执行出来的;这TM怎么可能!!!!实例2就已经实力打脸了!

真正的执行是这样的---------图三:
这里写图片描述
你看,这每一个圆圈代表每一次的程序执行时间A,底下那各自连接不上的憋屈红线就是定时器设置的间隔时间B,和图二是截然不同的,只有在函数每一次执行完之后才会调用定时器,继续重新进行调用;卧槽?这是为啥?这才是导致开头问题的原因!!!
所以我把这一节称之为辉煌下的破败

重点原理:

JavaScript是运行在单线程的环境中的,所以这就意味着定时器就成了要执行的计划!而不是必须要执行的铁律! 为啥呢? 当函数开始执行时在栈中创建出来一个栈帧,这个栈帧的执行是需要时间的,假设有3秒,在这三秒内,JavaScript的单线程特点就会确保在这3秒内全力的专一的去解决掉这个栈帧(函数)。所以在这个函数运行的时候定时器是没有能力终止他的运行的,因此当函数的运行时间大于间隔时间时,间隔时间1秒到了,但是程序还有2秒没有执行完,那你也给我老老实实的等着函数执行完!!!!


二:setTimeout() 平凡的力量##

奇坑无比的setInterval()有着看似无法解决的弊端;
据说有一种解决思路就是将间隔时间设置的大点,远大于函数执行的时间。。。定时器说了,老子管不了你还不能装看不见吗? 眼不见心不烦。。。
乍一看,确实有道理,但是这也不大合适,就像前面实例2中,每一次执行同一个函数的执行时间都是有些区别的。你该怎么去设置这个间隔时间呢?设置的大点?从实际上出发是不合适,因此果断抛弃。

在setTimeout()中,他的参数2代表的是延迟时间,他是先延迟后执行,setInterval()是先执行,后使用时间间隔;无限次执行;

原理图:
这里写图片描述
如图先有一段延迟时间,之后再执行函数方法;可以看到参数2 的延迟时间对函数的执行是毫无影响的;此时如果把setTimeout放到循环体中,那么是不是代表这就是一个秩序井然的程序。既可以达到setInterval的循环执行的效果,又解决了setInterval的时间不精确的问题;

 var i=0;
    function show() {
        console.log(i);
        i++;
        if(i<5){
            setTimeout(show,1000);
        }
    }
    show();

这是一段骚气的代码,如此造成循环每隔1秒就输出i;


总结
1:setInterval的参数2是间隔时间;
2:setTimeout的参数2是延迟时间;
3:setInterval受单线程影响出现时间不精确现象;
4:使用循环+setTimeout可以完成循环执行,并且弥补了setInterval的不足;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setInterval和setTimeout的缺陷和优势分析 的相关文章

  • ROS与matlab进行通讯—保姆级教程

    话不多说 xff0c 直接来进行配置 xff1a 所用软件 xff1a windows10下matlab2018b和同一台 电脑上虚拟机 virtubalbox上的Ubuntu melodic 18 04版本 第一步 xff1a 将虚拟机网
  • stm32蜂鸣器实验

    硬件连接 xff1a 提示 xff1a 不能通过IO口直接驱动大功率器件 实验步骤 xff1a 使能IO口时钟 调用RCC APB2PeriphColckCmd 初始化IO口模式 调用函数BEEP Init 操作IO口 xff0c 输出高低
  • samba源码安装

    Data 2017 11 30 Author cjh Theme samba源码安装 最近在玩TI的AM5728开发板 xff0c 采用交叉编译 xff0c 在使用nfs挂在确实有些不习惯 xff0c 所以最后还是忍不住在上面安装了samb
  • vscode使用

    VScode自动调整格式 Shift 43 Alt 43 F 简书 jianshu com vscode 设置 tab 为四个空格 abbcccdde的博客 CSDN博客 vscode设置tab为4个空格 生产力 VSCode必备插件 C
  • Ubuntu使用apt-get安装本地deb包

    Ubuntu使用apt get安装本地deb包 milantgh 博客园
  • 随遇而安也是一种选择

    随遇而安也是一种选择 故事的开头都是相似的 xff0c 故事的结尾各有各的传奇 xff0c 各有各的平凡 题记 高中的岁月总是让人难忘的 xff0c 菁菁岁月中的庆阳一中 xff0c 充满了书生意气的神采飞扬 xff0c 恩师与同窗 xff
  • OFDPA软件概述

    OFDPA软件概述 OF DPA xff08 openflow data plane abstraction xff09 是一个应用软件组件 实现了 openflow与broadcom SDK间适配层的功能 OF DPA在broadcom交
  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • wget和curl中使用代理

    命令使用代理 wget curl 都支持使用代理 wget e http proxy 61 10 1 4 43 8080 proxy mimvp com curl x 10 1 4 43 8080 proxy mimvp com 环境变量使
  • SQL 触发器与WebApi回执

    1 需求数据库表添加 xff0c 修改 xff0c 删除数据 xff0c 触发器生效 xff0c 推送数据数据到WCF接口 a 创建WCF服务 xff0c 发布服务 b 启用数据库CLR功能 xff0c 默认是关闭状态 EXEC sp co
  • inelliJ IDEA注册码

    http idea lanyus com
  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf
  • Outlook 2013/2016 显示“正在启动...“ 无法进入Outlook的解决方案

    因上次非正常关闭 xff0c 导致Outlook 2016启动时 xff0c 一直处于启动界面 xff0c 无法进入主界面正常工作 刚开始Outlook 2016启动界面显示的是 34 正在处理 34 查询网上各种方法 xff0c 安全启动
  • H265 CTU、CU、PU、TU划分的特点及要求

    目录 H265 CTU CU PU TU划分的特点及要求大小及划分模式常见问题1 Spec里对于CTU大小的规定在哪 xff1f 2 Spec对于TU大小的规定在哪 xff1f 3 Spec里对于M 2 M 2的划分方式的规定在哪里 xff
  • Oracle VM VirtualBox虚拟机使用问题总结

    我本机的配置是Ubuntu 18 04 43 Oracle VM VirtualBox虚拟机 6 1 12 43 虚拟win7操作系统 xff0c 对虚拟机了解甚少 xff0c 以下仅为一些实践中的经验 xff1a 一 升级后屏幕分辨率问题
  • C语言中string函数详解

    PS xff1a 本文包含了大部分strings函数的说明 xff0c 并附带举例说明 本来想自己整理一下的 xff0c 发现已经有前辈整理过了 xff0c 就转了过来 修改了原文一些源码的问题 xff0c 主要是用char 字义字符串的问

随机推荐

  • MP3的帧结构

    原文地址 xff1a http www eefocus com jjbearustc blog 07 09 3716 3e901 html MP3帧包括以下4个部分 xff1a 1 帧头 xff1a 比特流中包含同步和状态信息的部分 2 错
  • git am PATCH 失败的处理方法

    参考 xff1a http www cnblogs com domainfei articles 2433504 html http blog sina com cn s blog 5372b1a301015y0n html 英文原文地址
  • AAC帧格式及编码介绍

    参考资料 xff1a AAC以adts格式封装的分析 xff1a http wenku baidu com view 45c755fd910ef12d2af9e74c html aac编码介绍 xff1a http wenku baidu
  • 基于ubuntu14.04的Mobilenet_SSD环境搭建

    Data 2017 11 22 Author cjh Theme 基于ubuntu14 04的Mobilenet SSD环境搭建 Caffe for SSD xff1a https github com weiliu89 caffe tre
  • [open vSwitch]查看OVS端口ofport编号及对应虚拟机MAC

    在用open vSwitch做实验时 xff0c 我们经常需要知道OVS port对应的ofport编号 xff0c 这个比较容易 xff0c 用 ovs ofctl show bridge 就能得到 如 root 64 vaio ovs
  • 4、基于51单片机智能语音识别小车控制 语音口令说话控制系统设计

    毕设帮助 开题指导 技术解答 xff08 有偿 xff09 见文末 目录 摘要 一 硬件方案 二 设计功能 三 实物图 四 原理图 五 PCB图 六 程序源码 七 资料包括 摘要 随着电子工业的发展 xff0c 具有语音控制功能的小车越来越
  • H264中的SPS、PPS提取与作用

    牛逼的视频会议网站 xff1a http wmnmtm blog 163 com blog m 61 0 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 4
  • Linux系统备份与还原

    在 使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工
  • ip能ping开但是不能远程登陆

    刚刚安装ftp时玩将防火墙开启了 然后退出ssh再登陆时就登陆不上去了 出现 xff1a ip能ping开但是不能远程登陆 xff1b telnet ip 也不通 以为使系统问题 xff0c 但是想想刚刚的操作还是防火墙 解决方法 xff1
  • 如何检索CPCI-S

    1 打开Web of Science www webofknowledge com 2 选择数据库大类 xff1a Web of Science核心合集 xff1b 3 会议论文 xff0c 需要选择web of science数据库中的一
  • ZeroMQ消息传输协议 (v2.0)

    因为项目上在和其他团队联调时需要抓包分析消息正确性的问题 xff0c 因此在网络上查找了一下关于ZeroMQ的协议资料 找到如下文章 原文 另外这里有一篇对ZeroMQ实现讲的比较深的文章 xff0c 有兴趣也可以看看 xff1a 全网仅此
  • mysql左右匹配原则的用法和理解

    重点 xff1a mysql的最左匹配原则其实是和where后面的查询条件顺序是没有关系的只和索引的字段顺序有关 xff1b xff08 这里说的顺序是联合索引的顺序 xff09 这点网上很多地方都说错了 下面我们来用代码模拟一下问题 这里
  • 如何做好项目经理

    我一直赞同这个观点 xff1a 项目经理是干出来的 xff0c 不是学出来的 xff1b 是带出来的 xff0c 不是教出来的 一个人要成长为一名合格的项目经理主要不是靠学 xff0c 而是靠干 xff0c 当然学也很重要 靠干 xff0c
  • Javascript进制转换

    介绍一个简单的用Javascript进行 进制 转换的方式 xff1a 将十进制转换为十六进制 xff1a var i 61 10 alert parseInt 10 10 toString 16 同样 xff0c 将十六进制转换为十进制
  • js实现进制变换 10->16

    进制变换 10 gt 16 function heTransform data var pattern 61 new RegExp 39 1 9 d 0 39 判断是否是10进制数字 if pattern test data var hex
  • 用Visual C#实现局域网点对点通讯

    用Visual C xff03 实现局域网点对点通讯 作者 xff1a 马金虎 日期 xff1a 2003 9 28 出处 xff1a P2P中国 PPcn net 点对点即Peer To Peer xff0c 通常简写为P2P 所谓网络中
  • Makefile学习总结

    Data 2017 12 07 Author cjh Theme Makefile Tutorial 俗话说 xff0c 工欲善其事必先利其器 xff0c 所以我们先来介绍一下Makefile中的特殊字符 64 表示目标文件 表示所有的依赖
  • stmdb和ldmia

    stmdb xff1a db xff08 decrease before xff09 表示先减后存 指令 stmdb sp fp ip lr pc 34 表示sp等于最终被修改的sp的值 假设 sp 61 4096 xff0c 此条指令的执
  • ros之tf经验总结

    1 概念 搞ros都离不开tf xff0c 当建立一个机器人模型时 xff0c 第一步就是要确定机器人的tf结构 以kobuki导航运行为例 xff0c 首先是 map xff1a 地图坐标 xff0c 固定坐标系 odom xff1a 机
  • setInterval和setTimeout的缺陷和优势分析

    先把问题摆出来 xff1a 使用定时器的setInterval xff08 xff09 方法会出现程序并不是按照我们设定的精确时间而调用的问题 xff01 定时器 xff1a 在JavaScript中经常会使用定时器来进行延时或者是重复调用