什么是requestIdleCallback?和requestAnimationFrame有什么区别?

什么是requestIdleCallback?

我们都知道React 16实现了新的调度策略(Fiber), 新的调度策略提到的异步、可中断,其实就是基于浏览器的 requestIdleCallback和requestAnimationFrame两个API。


在 JavaScript 中,requestIdleCallback 是一个用于执行回调函数的 API,该回调函数会在浏览器空闲时执行,而不会影响页面的性能和用户体验。它的作用是在浏览器的空闲时段执行任务,以确保这些任务不会阻塞主线程,从而提高页面的响应性。

具体来说,requestIdleCallback 可以用于执行一些不那么紧急的任务,比如:

  1. 执行复杂的计算: 如果有一些需要较长时间才能完成的计算任务,可以使用 requestIdleCallback 将其放在空闲时执行,而不会阻塞用户与页面的交互。

  2. 后台数据同步: 可以在空闲时检查是否有需要同步的数据,并进行相应的后台同步操作。

  3. 图片懒加载: 对于页面上一些不太重要的图片,可以在空闲时加载,而不影响首屏渲染。

下面是一个简单的示例:

// 在空闲时执行任务
requestIdleCallback(function (deadline) {while (deadline.timeRemaining() > 0) {// 执行一些任务// ...}
});

deadline 是一个对象,用于提供当前帧的一些信息,而 deadline.timeRemaining() 是一个函数,用于获取当前帧还剩余的时间。

具体来说,deadline.timeRemaining() 返回一个表示当前帧剩余时间的毫秒数。在回调函数执行期间,可以多次调用这个函数,以检查当前帧是否还有足够的时间来执行任务。


requestIdleCallback 的第二个参数是一个 options 对象,用于配置回调函数的行为。这个对象有以下属性:

  1. timeout (可选): 用于指定回调函数执行的最大时间。如果在指定的时间内回调函数没有完成,它仍然会在空闲时执行,但是会提前终止。这可以用来确保回调函数在有限的时间内完成,以避免长时间运行的任务影响用户体验。这个值是一个毫秒数。
requestIdleCallback(function (deadline) {// 执行任务},{ timeout: 1000 } // 设置最大执行时间为 1000 毫秒
);
  1. signal (可选): 这是一个 AbortSignal 对象,可以用来取消回调函数的执行。当传递了这个参数时,如果 AbortSignal 被触发,回调函数会被取消。
const controller = new AbortController();
const signal = controller.signal;// 启动回调函数
requestIdleCallback(function (deadline) {// 执行任务},{ signal }
);// 在需要的时候取消
controller.abort();

这两个参数提供了对回调函数执行的一些控制和限制。在实际使用时,可以根据任务的性质和需求进行配置。

需要注意的是,requestIdleCallback 并不是所有浏览器都支持的标准 API,可能需要进行兼容性处理。另外,由于浏览器对空闲时段的定义可能不同,因此在实际使用时,应该根据具体情况进行测试和调整。最新的浏览器也提供了 requestAnimationFramerequestAnimationFrame 方法来执行类似的任务。

requestAnimationFrame和requestIdleCallback是宏任务还是微任务?

大家都知道异步任务分为宏任务和微任务,要搞清楚 requestAnimationFrame requestIdleCallback 是宏任务还是微任务就必须要搞清楚下面几个问题:

  • 浏览器在每一轮Event Loop事件循环中都会去渲染屏幕吗?
  • requestAnimationFrame在哪个阶段执行,是在渲染前还是渲染后?是在微任务执行前还是执行后?
  • requestIdleCallback在哪个阶段执行,是在渲染前还是渲染后?是在微任务执行前还是执行后?
console.log(22)
requestIdleCallback(()=>{console.log(11)
})console.log(33)
requestAnimationFrame(()=>{console.log("动画")
})

在这里插入图片描述


requestAnimationFrame和requestIdleCallback是和宏任务性质一样的任务,只是他们的执行时机不同而已。也有人说它们既不是宏任务也不是微任务,其实我们不必纠结这个,我们所要做的就是知道他们的执行时机就好。
浏览器在每一轮Event Loop事件循环中不一定会去重新渲染屏幕,会根据浏览器刷新率以及页面性能或是否后台运行等因素判断的,浏览器的每一帧是比较固定的,会尽量保持60Hz的刷新率运行,每一帧中间可能会进行多轮事件循环。

  • requestAnimationFrame回调的执行与task和microtask无关,而是与浏览器是否渲染相关联的。它是在浏览器渲染前,在微任务执行后执行。
  • requestIdleCallback是在浏览器渲染后有空闲时间时执行,如果requestIdleCallback设置了第二个参数timeout,则会在超时后的下一帧强制执行。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg 把mp4文件中某段视频转成gif文件

一 缘起背景: 有视频文件转gif动图的需求;网上下载的转换工具需要注册会员、否则带水印,还限制时长。 二 工具环境: win10 下 dos 操作 ffmpeg 三 操作命令: ffmpeg -i test.mp4 -ss 00:01:01 -t 00:00:19 -vf &q…

Mysql安全之基础合规

一、背景 某次某平台进行安全性符合型评估时,列出了数据库相关安全选项,本文特对此记录,以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别; 1)对登录Mysql系统用户的密码复杂度是否有要…

C++学习之路(十二)C++ 用Qt5实现一个工具箱(增加一个XML文本格式化功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《进制转换器功能》功能。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 XML文本格式化 」功能。下面我们就来看看如何来规划开发一个这样的小功能并且添加到我们…

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容 概述 什么是 AJAX ? AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 是一种用于创建快速动态网页的技术。 传统的网页(不使用 AJAX&#…

【动态规划】LeetCode2552:优化了6版的1324模式

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划 本题其它解法 C前缀和算法的应用:统计上升四元组 类似题解法 包括题目及代码C二分查找算法:132 模式解法一枚举3C二分查找算法&am…

二叉树(判断是否为对称二叉树)

题目(力扣): 观察题目,只需判断该二叉树是否对称。 判断二叉树是否对称,就可以换位去判断该二叉树的左子树和右子树是否对称。 这时就可以写一个辅助函数来方便判断。 该函数是判断两颗树是否镜像对称,这…

AppDelete 4.3.3(软件清理卸载工具)

AppDelete for Mac是一款运行在Mac平台上的强大软件卸载工具,AppDelete Mac版不仅可以删除应用程序,还可以删除小部件,首选项窗格,插件和屏幕保护程序及其相关文件,卸载快速又干净,仅需要简单的拖拽即可。 …

Swift 常用关键字

目录 一、数据类型 1. 流程控制 2. 访问控制 3. 功能修饰词 4. 错误处理 5. 泛型和类型 6. 其它关键字 二、部分关键字说明 1. guard 2. class 和 struct struct(结构体) class(类) 使用场景 3. mutating 4. proto…

基于Netty实现TCP通信

创建一个Maven项目添加下面依赖 <dependencies><!-- 日志依赖 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.32</version></dependency><dependency><g…

LeetCode刷题---斐波那契数列模型

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、第N个泰波那契数 题目链接&#xff1a;1137. 第 N 个泰波那契数 题目描述 泰波那契序列Tn定义如下: T00,T11,T2 1,且在n&g…

SpringBoot项目发送邮件

&#x1f4d1;前言 本文主要是【SpringBoot】——SpringBoot项目发送邮件的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f3…

电子学会C/C++编程等级考试2021年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:石头剪刀布 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头…