大家好,我是雷布斯。
昨天团队的 uncle13
老师在群里分享了这么一个面试题“requestAnimationFrame与宏任务区别”,是一位学员在面试某大厂的时候被问到的。
今天就分享一篇文章,相信能帮助大家解答这个问题。
大家都知道异步任务分为宏任务和微任务,要搞清楚 requestAnimationFrame
和 requestIdleCallback
是宏任务还是微任务就必须要搞清楚下面几个问题:
Event Loop
事件循环中都会去渲染屏幕吗?requestAnimationFrame
在哪个阶段执行,是在渲染前还是渲染后?是在微任务执行前还是执行后?requestIdleCallback
在哪个阶段执行,是在渲染前还是渲染后?是在微任务执行前还是执行后?在浏览器的Event Loop
中是有多个任务队列的,每个任务队列的执行时机是不一样的,下面直接上干货,说说浏览器执行任务的顺序
我们可以写一些代码到Chrome浏览器中验证一下,看看 requestAnimationFrame
和 requestIdleCallback
的执行顺序是怎样的。
运行以下这段代码
requestAnimationFrame(()=>{
console.log(111);
setTimeout(() => {
console.log(222);
});
Promise.resolve().then(() => {
console.log(333);
});
})
requestAnimationFrame(() => {
console.log(444);
Promise.resolve().then(() => {
console.log(555);
});
})
输出结果
运行以下这段代码
requestIdleCallback(() => {
console.log(111);
setTimeout(() => {
console.log(222);
})
Promise.resolve().then(() => {
console.log(333);
})
})
requestIdleCallback(() => {
console.log(444);
Promise.resolve().then(() => {
console.log(555);
})
})
输出结果
运行以下这段代码
Promise.resolve().then(() => {
console.log(111);
setTimeout(() => {
console.log(222);
})
Promise.resolve().then(() => {
console.log(333);
})
})
Promise.resolve().then(() => {
console.log(444);
Promise.resolve().then(() => {
console.log(555);
})
})
输出结果
还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果最近最近准备或者正在找工作,千万不要错过,我们的题库主打无广告和更新快哦~。
老规矩,也给我们团队的辅导服务打个广告。
原文作者:River_何
原文链接:https://juejin.cn/post/7134972903816167455