setTimeout,setInterval ,requestAnimationFrame定时器

news2024/10/6 2:22:54

setTimeout,setInterval ,requestAnimationFrame定时器

定时器函数通常用于执行定时任务,也就是说你做了一个功能放在定时器函数里,它可以在特定的时间去执行你的指令,或者说隔多长时间(单位时间内—毫秒为单位)去执行。

💫在异步编程中 定时函数也是不可缺席的,常见的定时器有: setTimeoutsetIntervalrequestAnimationFrame

🏃setTimeout

多人认为 setTimeout是延时多久后才开始执行函数,其实这里存在一些误解:

1️⃣精确延时
误解:很多人认为 setTimeout 会在指定的毫秒数后精确地执行回调函数。
事实 :实际上,setTimeout 只是告诉 JavaScript 引擎在指定的时间之后尝试执行回调函数。由于 JavaScript 是单线程的,如果在这段时间内主线程上有其他任务在运行,那么回调函数的执行会被推迟到当前任务完成之后。
2️⃣ 立即执行
误解:有些人认为将延迟设置为 0 毫秒(setTimeout(callback, 0))会让回调函数立即执行。
事实 :即使延迟设置为 0 毫秒,回调函数也会被推入事件队列,并在当前执行栈清空后执行。这是因为 JavaScript 的事件循环机制决定了任何 setTimeout 调用都会进入微任务队列(非立即执行的异步任务队列),并在当前宏任务完成后被执行。
3️⃣并发执行
误解: 有时人们误以为多个 setTimeout 调用可以同时执行。
事实 : 虽然 setTimeout 可以并行设置多个定时器,但由于 JavaScript 的单线程特性,这些回调函数仍然会按顺序执行,不会同时运行。
4️⃣多次执行
误解:一些开发者可能认为 setTimeout 会多次执行,特别是当他们试图在一个循环中设置多个定时器时。
事实 : 如果不适当地设置多个定时器,可能会导致意料之外的行为。例如,在循环中设置多个定时器而不考虑它们的执行顺序,可能导致所有回调几乎同时触发。

☕️setInterval

🎪 setInterval 函数作用和 setTimeout 基本一致,,区别在于setInterval是每隔一段时间执行一次回调函数。
🚣 通常情况不是很推荐使用 setInterval,原因有两点:他和 setTime基本一致,不能保证在预期时间执行任务,其次就是存在执行积累的问题,比如说以下代码:

// 定义一个名为 demo 的函数
function demo() {
    // 使用 setInterval 设置一个定时器,每隔 1000 毫秒(1秒)执行一次提供的回调函数
    setInterval(function() {
        console.log(2); // 每次执行时打印数字 2 到控制台
    }, 1000); // 设置间隔时间为 1000 毫秒

    // 尝试调用 sleep 函数,等待 2000 毫秒(2秒)
    // 注意:JavaScript 中没有原生的 sleep 函数,这里是模拟休眠
    sleep(2000); // 这里的 sleep 函数在标准 JavaScript 中是不存在的

    // 由于 JavaScript 是单线程的,这里 sleep 函数如果是阻塞的,
    // 那么它将会阻止其他所有代码(包括定时器)的执行,直到它完成
}

// 调用 demo 函数
demo();

🚅以上代码在浏览器环境中,如果定时器出现了耗时操作,由于 JavaScript 是单线程的,这里 sleep 函数如果是阻塞的,多个回调函数会在耗时操作结束以后同时执行,这样就可能会带来性能上的问题。

🎡 requestAnimationFrame

requestAnimationFrame 是一种在浏览器中用来执行动画的技术,它可以让动画更流畅且性能更高。
🚁 相比起上面两个函数它有以下优点:

✖️ 与屏幕刷新率同步:
requestAnimationFrame 的回调会在浏览器的下一帧绘制之前被调用,通常每秒 60 帧(即每 16.67 毫秒一帧),自带节流功能,这使得动画更加平滑。
➕ 自动暂停:
当包含动画的标签页不在前台时, requestAnimationFrame 会自动暂停,从而节省计算资源。
➖ 更高效:
如果浏览器在某一帧内无法渲染(例如因为 CPU 负载过高), requestAnimationFrame 不会堆积回调,而是跳过这一帧。

🌠requestAnimationFrame 函数的延时效果是精确的,没有其他定时器时间不准的问题,当然也可以通过该函数去实现 setTimeout

// 定义一个模拟 setInterval 的函数
function setInterval(callback, interval) {
    // 用于存储 requestAnimationFrame 的返回值
    let timer;

    // 获取当前时间的函数引用,提高代码可读性和一致性
    const now = Date.now;

    // 初始化开始时间和结束时间
    let startTime = now();
    let endTime = startTime;

    // 定义一个内部循环函数
    const loop = () => {
        // 使用 requestAnimationFrame 请求下一帧
        timer = window.requestAnimationFrame(loop);

        // 获取当前时间
        endTime = now();

        // 如果从开始到现在的时间差大于或等于指定的间隔时间 interval
        if (endTime - startTime >= interval) {
            // 重置开始时间和结束时间
            startTime = endTime = now();

            // 调用回调函数,并传入当前的 timer 值
            callback(timer);
        }
    }

    // 第一次调用 loop 函数,开始循环
    timer = window.requestAnimationFrame(loop);

    // 返回 timer 值,以便将来可以通过它取消动画
    return timer;
}

// 初始化计数器
let a = 0;

// 使用自定义的 setInterval 函数,每隔 1000 毫秒(1秒)执行一次回调函数
setInterval(timer => {
    // 打印数字 1 到控制台
    console.log(1);

    // 计数器增加
    a++;

    // 如果计数器 a 达到 3,则取消动画
    if (a === 3) {
        cancelAnimationFrame(timer);
    }
}, 1000);

今天的分享就到这里啦,感谢大家的阅览,小江会一直与大家一起努力,文章中如有不足之处,你的支持是我前进的最大动力,请多多指教,感谢支持,持续更新中 ……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么每个人都要学习项目管理?

在这个已然到来的超级个体时代,项目管理这项技能,不仅仅是项目经理才需要掌握的,而是每个想要独当一面之人的必备技能。 所谓的独当一面,就是从一个人做好自己的事,到带领一群人从头到尾把事做成。而学习项目管理&…

路由器的工作机制

在一个家庭或者一个公司中 路由器的作用主要有两个(①路由–决定了数据包从来源到目的地的路径 通过映射表决定 ②转送–通过路由器知道了映射表 就可以将数据包从路由器的输入端转移给合适的输出端) 我们可以画一张图来分析一下: 我们好好来解析一下这张图&#x…

Chromium 搜索引擎功能浅析c++

地址栏输入:chrome://settings/searchEngines 可以看到 有百度等数据源,那么如何调整其顺序呢,此数据又存储在哪里呢? 1、浏览器初始化搜索引擎数据来源在 components\search_engines\prepopulated_engines.json // Copyright …

el-pagination组件封装

组件使用 源代码&#xff1a; <script setup> import Pagination from /components/pagination/index.vue import {ref} from "vue";const pageNum ref(1) const pageSize ref(10) const total ref(120)function loadData() {// 加载数据 } </script>…

C++教程一口气讲完!(万字讲解)( ̄y▽ ̄)╭ Ohohoho... 下

C 常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量&#xff0c;只不过常量的值在定义后不能进行修改。 …

【设计模式】软件设计原则——开闭原则里氏替换单一职责

开闭原则内容引出 开闭原则 定义&#xff1a;一个软件实体&#xff0c;类&#xff0c;函数&#xff0c;模块&#xff1b;对扩展开放&#xff0c;对修改关闭。用抽象构建框架&#xff0c;用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时&#xff0c;尽量不修…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难&#xff0c;但随着用户量上升之后&#xff0c;不论是存储还是判断对数据量来说都很麻烦&#xff1b;假如每天有100万用…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见&#xff1b; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix&#xff1b; 2. pytorch 与 pytorch geometric 各…

深度学习-----------------------------束搜索

目录 贪心搜索&#xff08;一般来说计算最快的&#xff09;穷举搜索&#xff08;一般来说是最好的&#xff0c;但可能算不动&#xff09;束搜索&#xff08;Beam Search&#xff09; 总结 贪心搜索&#xff08;一般来说计算最快的&#xff09; 在seq2seq中使用贪心搜索来预测序…

软考数据库部分 ---- (概念数据库模型,三级模式,两级映像,事物管理)

文章目录 一、概念数据库模型二、结构数据库模型三、三级模式四、两级映像五、关系模式基本术语六、关系模式七、关系的数学定义八、数据定义语言九、SQL访问控制十、视图十一、索引十二、关系模式十三、范式十四、数据库设计十五、事物管理&#xff08;ACID&#xff09;十六、…

基于SPI协议的Flash扇区擦除实验

当一块Flash芯片中的不同的扇区烧录了不同的程序&#xff0c;而我们只想擦除某个扇区的程序保留其他程序时&#xff0c;Flash的全擦除是不能满足要求的&#xff0c;这时候就需要扇区擦除来实现这一功能。扇区擦除可以对Flash芯片中的某一扇区进行擦除而不改变其他扇区中的存储数…

2.3MyBatis——插件机制

2.3MyBatis——插件机制 1.基本用法2.原理探究2.1加载过程2.2执行过程2.2.1 插件的执行点2.2.2 SQL执行的几个阶段2.2.3 如何梳理出执行流程 插件机制是一款优秀框架不可或缺的组成部分&#xff0c;比如spring、dubbo&#xff0c;还有我们要聊的Mybatis等等。所谓插件&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种&#xff0c;性能如下所示&#xff1a; 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

Linux驱动开发(速记版)--printctl子系统

第102章 pinctrl 子系统的引入 Linux中的 pinctrl子系统是管理和配置GPIO引脚的框架&#xff0c;提供标准化方法以适应不同硬件。 它遵循 Linux内核设备模型&#xff0c;分为设备、驱动等部分。 本章节从设备和驱动角度介绍 pinctrl子系统。 102.1 pinctrl 设备树 在设备树中&a…

旅游心动盲盒:开启个性化旅行新体验

嘿&#xff0c;宝子们&#xff01;在如今这个数字化时代呀&#xff0c;文心智能体可是给咱们的生活带来了超多便利和创新呢。今天呀&#xff0c;我来给大家介绍一款超棒的智能体——旅游心动盲盒&#xff0c;它肯定能给你的旅行带来全新的惊喜和超个性化的体验哟。 一、项目背…

基于H3C环境的实验——OSPF

目录 实验设备和环境 实验设备 实验环境 实验记录 1、单区域 OSPF基本配置 步骤1:搭建实验环境并完成基本配置 步骤2:检查网络连通性和路由器路由表。 步骤3:配置OSPF 步骤4:检查路由器OSPF邻居状态及路由表 实验设备和环境 实验设备 三台路由器、两台PC、电源线、两…

GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】

目录 一、C/S详细通信流程图二、消息类型定义与json标签1. 消息类型定义2. JSON标签3.结构体示例及其 JSON 表示&#xff1a;4.完整代码与使用说明 三、客户端发送消息1. 连接到服务器2. 准备发送消息3. 创建 LoginMes 并序列化4. 将序列化后的数据嵌入消息结构5. 序列化整个 M…

java 数据存储方式

1. 变量存储 这是最基本的数据存储方式&#xff0c;通过声明变量来存储数据。变量可以是基本数据类型&#xff08;如int、float、char等&#xff09;&#xff0c;也可以是引用数据类型&#xff08;如对象、数组等&#xff09;。变量存储的数据通常存储在内存中&#xff0c;随着…

有状态(Session) VS 无状态(Token)

目录 概念 JWT Token在项目中使用 概念 有状态和无状态服务是两种不同的服务架构&#xff0c;两者的不同之处在于对于服务状态的处理。 1、有状态服务 是指程序在执行过程中生成的中间数据&#xff0c;服务器端一般都要保存请求的相关信息&#xff0c;每个请求可以默认地使…

Hugging Face 任意大模型仓库劫持 - 无声的破坏

摘要 在这篇博客中&#xff0c;我们展示了攻击者如何攻击Hugging Face的Safetensors转换空间及其相关的服务机器人。这些服务是一个在Hugging Face上广受欢迎的服务&#xff0c;专门用于将不安全的机器学习模型转换为更安全的版本。我们随后展示了如何通过Hugging Face自身的服…