返回博客

使用 requestAnimationFrame 模拟 setInterval

使用 JavaScript 中的 requestAnimationFrame 函数模拟 setInterval 函数的功能,并比较两种方法的差异和优缺点。

Mt.r
|

requestAnimationFrame 实现 setInterval

function setInterval(callback, delay) {
  let start = new Date().getTime();
  let handle = {};

  function loop() {
    handle.value = requestAnimationFrame(loop);
    let current = new Date().getTime();
    let delta = current - start;
    if (delta >= delay) {
      callback.call();
      start = new Date().getTime();
    }
  }

  handle.value = requestAnimationFrame(loop);
  return handle;
}
function customizeSetInterval(callback, interval) {
    let timer = null;
    let startTime = Date.now();
    let loop = () => {
        let endTime = Date.now();
        if (endTime - startTime >= interval) {
            startTime = endTime = Date.now();
            callback(timer);
        }
        timer = window.requestAnimationFrame(loop);
    }
    loop();
    return timer;
}
customizeSetInterval((timer) => {
    console.log(1);
    // cancelAnimationFrame(timer);
}, 1000)

备注