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

news2024/11/19 21:20:39

什么是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.coloradmin.cn/o/1269708.html

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

相关文章

Go 谈论了解Go语言

一、引言 Go的历史回顾 Go语言(通常被称为Go或Golang)由Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计,并于2009年正式公开发布。这三位设计者都曾在贝尔实验室工作,拥有丰富的编程语言和操作系统研究经验。Go的诞生…

数据结构day6作业

初次进入len100;if(resuillen)不符合条件,执行resultcompetu_date(arr,--len),从此处开始递归. 直到len0: 此时len0; ---result0; ---return arr[0]1; 上一层len1; ---result1---执行语句return (result%2)?(result arr[len]):((result 1)*arr[len]);得到return 1arr[1]3 …

visionOS空间计算实战开发教程Day 10 照片墙

本例选择了《天空之城》的25张照片,组成5x5的照片墙)。首先我们在setupContentEntity方法中构建了一个纹理数组,将这25张照片添加到数组images中。其中封装了setup方法,借助于visionOS对沉浸式空间的支持,我们创建了三…

解决:ModuleNotFoundError: No module named ‘qt_material‘

解决:ModuleNotFoundError: No module named ‘qt_material’ 文章目录 解决:ModuleNotFoundError: No module named qt_material背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报错&…

基于asp.net 消防安全宣传网站设计与实现

目 录 1 绪论 1 1.1课题背景 1 1.2 目的和意义 1 1.3主要研究内容 1 1.4 组织结构 2 2 可行性分析 3 2.1技术可行性 3 2.2经济可行性 3 2.3操作可行性 3 2.4系统开发环境 4 3 需求分析 7 3.1性能分析 7 3.2业务流程分析 7 3.3数据流程分析 9 4 系统设计 11 4.1系统…

drawio 流程图以图片保存

随笔记录 目录 1. drawio 介绍 2. 绘制流程图以白底图片保存 2.1 流程图原始图​编辑 2.2 修改配置 2.3 流程图以图片保存 2.4 图片保存后效果展示 1. drawio 介绍 是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了 Web…

Leetcode2336 无限集中的最小数字

题目: 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, ...] 。 实现 SmallestInfiniteSet 类: SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void addBack(int nu…

[node]Node.js事件

[node]Node.js事件 EventEmitter属性方法error 事件 实例应用简单实例onceremoveListenerlistenerCounterror 事件完整实例 继承 事件循环事件驱动程序 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列 Node.js 里面的许多对象都会分发事件:一个 n…

从0开始学习JavaScript--JavaScript 单例模式

单例模式是一种常见的设计模式,它保证一个类仅有一个实例,并提供一个全局访问点。在 JavaScript 中,单例模式通常用于创建唯一的对象,以确保全局只有一个实例。本文将深入探讨单例模式的基本概念、实现方式,以及在实际…

linux 磁盘扩容初始化挂载 笔记

目录 说明环境信息前提条件 操作步骤 说明 linux 系统磁盘扩容步骤 环境信息 系统信息:Linux version 4.19.90-23.8.v2101.ky10.aarch64cpu信息:Kunpeng-920 、aarch64、64-bit、HiSilicon 前提条件 有未初始化的用户磁盘操作系统可以支持当前磁盘的…

【Spring系列】DeferredResult异步处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

VC++调试QT源码

环境:vs2017 qt 5.14.2 1:首先我们需要选择我们的源码路径 右键解决方案-》属性-》通用属性-》调试源文件-》在窗口内添加QT下载时的源码**.src文件夹**,这里最好把源码 D:\software\QT\path\5.14.2\Src 源文件里面的Src文件做一个备份出来…

从意义中恢复,而不是从数据包中恢复

从书报,录放机,电视机到智能手机,vr 眼镜,所有学习的,娱乐的工具或玩具,几乎都以光声诉诸视听,一块屏幕和一个喇叭。 视觉和听觉对任何动物都是收发信息的核心,诉诸视觉和听觉的光和…

达梦数据库使用

达梦数据库使用 📑前言 本文主要是【达梦数据库】——达梦数据库简单使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他…

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…

机关单位档案分类及整理方法

机关单位档案主要包含文书档案、干部职工档案(人事档案)、会计档案、科技档案(科学研究、基本建设、设备仪器、产品)、诉讼档案、音像档案、照片档案、电子档案等等,这其中,不同种类,不同载体的…

卷积神经网络(CNN)注意力检测

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1.加载数据2. 可视化数据4. 配置数据集 三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估1. Accuracy与Loss图2. …

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

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

更改AndroidStudio模拟器位置

C盘何等的珍贵,可是好多工具,软件非得默认安装在C盘。。导致C盘越来越紧张。。 在日常使用过程中,安装任何软件都会将其安装到非系统盘下,Android模拟器也不能例外。保护好C盘也是日常一个良好的习惯。 Android AVD默认路径&…

watch监听中重复触发如何解决?

在实际开发工程中通过获取后端数据监听判断数组中长度是否大于0从而调用其他的方法,但是如果data域中的数据出现变化的话,就会导致监听中的方法重复调用,导致一些不必要的bug,例如: 原理: watch监听的数据…