requestAnimationFrame与requestIdleCallback🈶什么区别

50 阅读1分钟

requestAnimationFrame与requestIdleCallback🈶什么区别??

requestAnimationFrame是一个与重绘有关的函数,在绘制下一帧的时候调用
而requestIdleCallback是与事件循环有关的函数,当前事件循环结束前的空闲时间内执行回调用

requestIdelCallback

requestIdleCallback是在事件循环即将进入下一个循环的时候,会执行该函数中的callback

requestAnimationFrame.

是在浏览器将发生重绘的间隙被调用

const requestIdleCallbackId = requestIdleCallback(() => {
  console.log('requestIdleCallback被调用');
});

console.log('requestIdleCallbackId', requestIdleCallbackId);

function testEventLoop () {
  console.log('start'); // 押入执行栈并执行

  const promise1 = new Promise((resolve, reject) => {
    console.log('create promise.'); // 押入执行栈并执行
    resolve('resolve promise 1');
  });

  setTimeout(() => {
    // setTimeout中的所有代码压入宏务队列中
    console.log('第一个setTimeout开始执行');
    const nextEventLoopStartPromise = new Promise((resolve, reject) => {
      console.log('第一个setTimeout执行中创建promise');
      resolve('resolve第一个setTimeout中的promise');
    });
    nextEventLoopStartPromise.then((res) => {
      console.log('第一个setTimeout中的promise被执行');
    });
    console.log('第一个setTimeout结束');
    setTimeout(() => {
      console.log('第一个setTimeout中创建的setTimeout被执行');
    }, 0);
  }, 0);

  const promise2 = new Promise((resolve, reject) => {
    console.log('create promise2 in setTimeout'); // 执行
    resolve('resolve promise2 in setTimeout');
  });

  console.log('创建列2个promise和一个setTimeout后的console'); // 直接执行

  promise2.then((res) => {
    console.log('promise2的then被执行', res); // 微任务队列
  });

  setTimeout(() => {
    console.log('第二个setTimeout被调用'); // 宏任务队列
  }, 0);

  const promise3 = new Promise((resolve, reject) => {
    console.log('create promise3'); // 执行
    resolve('resolve promise3 ');
  });

  promise3.then((res) => {
    console.log('promise3的then被执行', res); // 微任务队列
  });

  promise1.then((res) => {
    console.log('promise1的then被执行', res); // 微任务队列
  });

  console.log('end'); // 执行
}

testEventLoop();

执行以上代码可以知道,requestIdleCallback的回调函数是在浏览器空闲的时候执行的,执行的时间并不确定。