当前位置:网站首页>setTimeout 、setInterval、requestAnimationFrame
setTimeout 、setInterval、requestAnimationFrame
2022-08-03 12:10:00 【rananie】
文章目录
setTimeout 、setInterval、requestAnimationFrame
面试题
- setTimeout(cb, 0)会立刻执行吗?
- settimeout定时的时间准确吗? 为什么不准确? 怎么解决?
- setTimeout和requestAnimation的区别
- requestAnimationFrame讲一下你的理解
- setTimeout实际延迟时间
- 用setTimeout实现setInterval,实现一个随时停止的版本
- setTimeout 和 setInterval区别
- JS实现动画的方式
- requestAnimationFrame与requestIdleCallback分别是什么?
- requestAnimationFrame的执行时机?
- 事件循环,宏任务微任务,requestanimationframe回调函数中进行大量计算,会阻塞页面的渲染吗
setTimeout定时器的时间准吗?
setTimeout的时间是指ms之后将回调函数放入宏队列中,当时间为0时,
- 在nodejs中
setTimeout(demo, 0) === setTimeout(demo, 1),最小是1ms - 在浏览器里面
setTimeout(demo, 0) === setTimeout(demo, 4),最小是4ms
在事件循环中,先执行完同步代码后,先需要执行微队列中任务,然后再到宏队列,所以定时器的事件是不准确的
setTimeout 和 setInterval
setTimeout(fn,time):在指定时间后执行一次回调函数setInterval(fn,time):周期性地执行回调函数
setInterval存在的问题
1.某些间隔被跳过;
2.实际代码执行间隔 <= 设定的时间间隔
假设,某个onclick事件处理程序使用setInterval()设置了200ms间隔的定时器。如果事件处理程序花了300ms多一点时间完成,同时定时器代码也花了差不多的时间,就会同时出现跳过某间隔的情况
使用setTimeout构造轮询能保证每次轮询的间隔
setTimeout(function fn() {
// do something
setTimeout(fn, delay)
}, delay)
当一个定时器执行完毕后,才开启另一个定时器。
这样做的好处 ①在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔。② 它可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。
用setTimeout实现setInterval,可以随时停止
function mySetTimeout(fn,delay){
let timer = null;
let interval = ()=>{
fn();
timer = setTimeout(interval,delay); //开启后续定时器,取消也是取消后续的
}
setTimeout(interval,delay); //第一次调用定时器
return {
cancel:()=>{
clearTimeout(timer);
}
}
}
const {
cancel } = mySetTimeout(() => console.log(888),1000)
setTimeout(()=>{
cancel()
},4000)
requestAnimationFrame H5新增API
JS实现动画的方法
- setTimeout
- setInterval
- requestAnimationFrame
显示器的刷新频率是60Hz,浏览器也会尽量保持60Hz的刷新率运行,也就是16.7ms刷新一帧所以(60次/s)
requestAnimationFrame是什么?
requestAnimationFrame是H5新增的API类似于setTimeout ,告诉浏览器希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数。主要用途是按帧对网页进行重绘。
requestAnimationFrame的基本思想就是与显示屏的刷新频率保持同步,利用这个刷新频率进行页面重绘。
setTimeout 和requestAnimationFrame 的区别
| 类型 | 回调函数执行的时机 | 是否在后台一直执行 | 丢帧现象 |
|---|---|---|---|
| setTimeout | 用户指定时间,放入宏队列中,最终执行的时间是不确定的 | √ | √ 由于执行时间的不确定性,setTimeout的执行步调可能和屏幕的刷新步调不一致,从而引起丢帧现象。 |
| requestAnimationFrame | 由系统决定回调函数的执行时机,在下次重绘之前调用 | × 它会在页面出现的时候才会执行,一旦页面不处于浏览器的当前标签,就会自动停止刷新 原因:当页面处于未激活的状态下,该页面的屏幕刷新任务会被系统暂停 | × 在重绘之前调用不会丢帧 |
requestIdleCallback
浏览器一帧内需要完成如下六个步骤的任务
处理用户的交互
JS 解析执行
帧开始。窗口尺寸变更,页面滚去等的处理
requestAnimationFrame(rAF)
布局
绘制
requestAnimationFrame在每次屏幕刷新的时候被调用requestIdleCallback在每次屏幕刷新时,判断当前帧是否还有多余的时间(上述6个步骤执行完后),如果有,则会调用requestIdleCallback的回调函数,
边栏推荐
- YOLOv5训练数据提示No labels found、with_suffix使用、yolov5训练时出现WARNING: Ignoring corrupted image and/or label
- 基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
- I in mother's womb SOLO20 years
- LyScript implements memory stack scanning
- 899. 有序队列
- 【精品必知】Pod生命周期
- 通过点击CheckBox实现背景变换小案例
- LeetCode-142. 环形链表 II
- ROS中编译通过但是遇到可执行文件找不到的问题
- LeetCode-48. 旋转图像
猜你喜欢
随机推荐
码率vs.分辨率,哪一个更重要?
Knowledge Graph Question Answering System Based on League of Legends
用C语言解决A+B问题,A-B问题,A*B问题
矩阵的计算[通俗易懂]
opencv学习—VideoCapture 类基础知识「建议收藏」
Chapter 15 Source Code File REST API Introduction
flink流批一体有啥条件,数据源是从mysql批量分片读取,为啥设置成批量模式就不行
4500字归纳总结,一名软件测试工程师需要掌握的技能大全
Go 语言快速入门指南: 介绍及安装
PC client automation testing practice based on Sikuli GUI image recognition framework
类型转换、常用运算符
基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
第5章 实现首页Tab数据展示
特征降维学习笔记(pca和lda)(1)
基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
pandas连接oracle数据库并拉取表中数据到dataframe中、生成当前时间的时间戳数据、格式化为指定的格式(“%Y-%m-%d-%H-%M-%S“)并添加到csv文件名称中
第四周学习 HybridSN,MobileNet V1,V2,V3,SENet
分享一款实用的太阳能充电电路(室内光照可用)
最牛逼的集群监控系统,它始终位列第一!
bash case用法





![[论文阅读] (23)恶意代码作者溯源(去匿名化)经典论文阅读:二进制和源代码对比](/img/48/8d2cdf33862dc4622230c69d381b82.png)



