阿里前端面试题:requestAnimationFrame实现类似setInterval的计时器

发布于 2022-09-06 21:14:26 字数 49 浏览 46 评论 0

使用requestAnimationFrame实现类似setInterval的计时器

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

相思碎 2022-09-13 21:14:26

供参考,没有实现字符串功能,反正也不推荐使用。

function setInterval2 (cb, delay, ...args) {
  // 记录所有正在运行的 interval 用于撤销
  let pool = window[Symbol.for('IntervalPool')]
  if (!pool) {
    pool = {}
    window[Symbol.for('IntervalPool')] = pool
  }

  // interval 最低 10ms,虽然每 frame 至少得 16ms
  delay = delay >= 10 ? delay : 10
  // interval id
  let ticket = Date.now()
  // 每次 interval 开始时间
  let startTime = ticket
  pool[ticket] = true
  loop()
  return ticket

  function loop () {
    if (!pool[ticket]) { return }
    const now = Date.now()
    if (now - startTime >= delay) {
      startTime = now
      cb(...args)
    }
    requestAnimationFrame(loop)
  }
}

function clearInterval2 (ticket) {
  let pool = window[Symbol.for('IntervalPool')]
  if (pool && pool[ticket]) {
    delete pool[ticket]
  }
}
本王不退位尔等都是臣 2022-09-13 21:14:26
function a(callback){
       requestAnimationFrame(function(){
           //你的代码
           callback && callback()
           a()
       })
}

需要注意requestAnimationFrame的浏览器兼容性问题

window.requestAnimationFrame = window.requestAnimationFrame || 
window.webkitRequestAnimationFrame || 
window.mozRequestAnimationFrame || 
window.msRequestAnimationFrame || 
window.oRequestAnimationFrame || 
function (callback) {
    //为了使setTimteout的尽可能的接近每秒60帧的效果
    window.setTimeout(callback, 1000 / 60);
};
    
window.cancelAnimationFrame = window.cancelAnimationFrame || 
Window.webkitCancelAnimationFrame || 
window.mozCancelAnimationFrame || 
window.msCancelAnimationFrame || 
window.oCancelAnimationFrame || 
function (id) {
    //为了使setTimteout的尽可能的接近每秒60帧的效果
    window.clearTimeout(id);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文