setTimeout,setInterval ,requestAnimationFrame定时器

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);

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于cefsharp访问iqiyi.com显示403 Forbidden解决办法(2种方法)

1.cefsharp浏览器访问iqiyi.com异常 (403 Forbidden) 403 Forbidden Q_DENY: Forbidden by iQIYI WAF! Any problem, contact iQIYI Security Group (security-help). Request ID: c0597b5aeead125907f7 2.解决办法(2种) 1)屏蔽掉 cefSettings.UserAgent2)修改 cefSettings…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值:" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…

.NET Core 高性能并发编程

一、高性能大并发架构设计 .NET Core 是一个高性能、可扩展的开发框架,可以用于构建各种类型的应用程序,包括高性能大并发应用程序。为了设计和开发高性能大并发 .NET Core 应用程序,需要考虑以下几个方面: 1. 异步编程 异步编程…

开发环境简单介绍

目录 开发环境keil的安装和使用 keil的介绍 keil的安装 keil的简单使用 STC-ISP的安装 STC-ISP简单介绍 开发环境测试 总结 开发环境keil的安装和使用 keil的介绍 Keil uVision5是一个集成开发环境(IDE),用于对嵌入式系统中的微控制器…

Windows 11 安装配置 Git 教程

目录 Git Windows 11 环境安装配置 Git Git Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。Git是目前世界上最流行的版本控制系统,广泛应用于软件开发中。 以下是Git的一些关键特…

如何用深度神经网络预测潜在消费者

1. 模型架构 本项目采用的是DeepFM模型,其结构结合了FM(因子分解机)与深度神经网络(DNN),实现了低阶与高阶特征交互的有效建模。模型分为以下几层: 1.1 FM部分(因子分解机层&#…

深入探究:在双链表指定元素的后面进行插入操作的顺序

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝惟有主动付出,才有丰富的果…

Win10系统插入带有麦克风的耳机_麦克风不起作用_解决方法_亲测成功---Windows运维工作笔记054

今天我在使用讯飞输入法的时候,想通过讯飞的语音输入法来提高自己的输入效率。 但是这个时候发现一个问题就是我插入我的台式机的是一个带有麦克风的耳机。 但是发现我这个耳机没有办法被电脑识别出麦克风来,所以说就没办法使用讯飞输入法的语音输入功能来直接输入文字了。…

【重学 MySQL】五十六、位类型

【重学 MySQL】五十六、位类型 定义赋值与使用注意事项应用场景 在MySQL数据库中,位类型(BIT类型)是一种用于存储位字段值的数据类型。 定义 BIT(n)表示n个位字段值,其中n是一个范围从1到64的整数。这意味着你可以存储从1位到64…

华为GaussDB数据库之Yukon安装与使用

一、Yukon简介 Yukon(禹贡),基于openGauss、PostgreSQL、GaussDB数据库扩展地理空间数据的存储和管理能力,提供专业的GIS(Geographic Information System)功能,赋能传统关系型数据库。 Yukon 支…

论文笔记(四十七)Diffusion Policy: Visuomotor Policy

Diffusion Policy: Visuomotor Policy 文章概括摘要1. 介绍2. 扩散策略的公式化2.1 去噪扩散概率模型2.2 DDPM 训练2.3 用于视觉运动策略学习的扩散模型 3 关键设计决策3.1 网络架构选项3.2 视觉编码器3.3 噪声计划3.4 加速实时控制的推理 4. 扩散策略的四个引人入胜的特性4.1 …

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SABO-SVR减法平均算法优化…

【api连接ChatGPT的最简单方式】

通过api连接ChatGPT的最简单方式 建立client 其中base_url为代理,若连接官网可省略;配置环境变量 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )或给出api和base_url client OpenAI(api_key&…

数据仓库简介(一)

数据仓库概述 1. 什么是数据仓库? 数据仓库(Data Warehouse,简称 DW)是由 Bill Inmon 于 1990 年提出的一种用于数据分析和挖掘的系统。它的主要目标是通过分析和挖掘数据,为不同层级的决策提供支持,构成…

wordpress源码资源站整站打包32GB数据,含6.7W条资源数据

源码太大了,足足32gb,先分享给大家。新手建立资源站,直接用这个代码部署一下,数据就够用了。辅助简单做下seo,一个新站就OK了。 温馨提示:必须按照顺序安装 代码下载

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前:脚注位于左下角,但右栏与左栏内容对其,未填充右下角的空白区域 解决方法 备份源文件复制脚注内…

【HTML|第1期】HTML5视频(Video)元素详解:从起源到应用

日期:2024年9月9日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对…

【机器学习】探索GRU:深度学习中门控循环单元的魅力

目录 🍔 GRU介绍 🍔 GRU的内部结构图 2.1 GRU结构分析 2.2 GRU工作原理 2.4 Bi-GRU介绍 2.3 使用Pytorch构建GRU模型 2.5 GRU优缺点 🍔 小结 学习目标 🍀 了解GRU内部结构及计算公式. 🍀 掌握Pytorch中GRU工具…

MySQL--数据库约束(详解)

目录 一、前言二、概念三、数据库约束3.1 约束类型3.1.1 NOT NULL 约束3.1.2 UNIQUE (唯一)3.1.3 DEFAULT(默认)3.1.4 PRIMARY KEY(主键)3.1.5 FOREIGN KEY(外键)3.1.6 CHECK 四、总结 一、前言…

[Linux#61][UDP] port | netstat | udp缓冲区 | stm32

目录 0. 预备知识 1. 端口号的划分范围 2. 认识知名端口号 3. netstat 命令 4. pidof 命令 二.UDP 0.协议的学习思路 1. UDP 协议报文格式 报头与端口映射: 2. UDP 的特点 面向数据报: 3. UDP 的缓冲区 4. UDP 使用注意事项 5. 基于 UDP 的…