requestAnimationFrame替代setTimeout、setInterval

requestAnimationFrame相较于setTimeout、setInterval的优点这里不多说,想要了解的同学可以戳requestAnimationFrame最佳实践
requestAnimationFrame原生没有自定义时间间隔执行的功能,比如想要实现每隔1s执行一次的功能或者延时1s执行,每次都要重写间隔时间的重复代码,想着可以将之抽出。直接上代码:

const RAF = {
  intervalTimer: null,
  timeoutTimer: null,
  setTimeout (cb, interval) { // 实现setTimeout功能
    let now = Date.now
    let stime = now()
    let etime = stime
    let loop = () => {
      this.timeoutTimer = requestAnimationFrame(loop)
      etime = now()
      if (etime - stime >= interval) {
        cb()
        cancelAnimationFrame(this.timeoutTimer)
      }
    }
    this.timeoutTimer = requestAnimationFrame(loop)
    return this.timeoutTimer
  },
  clearTimeout () {
    cancelAnimationFrame(this.timeoutTimer)
  },
  setInterval (cb, interval) { // 实现setInterval功能
    let now = Date.now
    let stime = now()
    let etime = stime
    let loop = () => {
      this.intervalTimer = requestAnimationFrame(loop)
      etime = now()
      if (etime - stime >= interval) {
        stime = now()
        etime = stime
        cb()
      }
    }
    this.intervalTimer = requestAnimationFrame(loop)
    return this.intervalTimer
  },
  clearInterval () {
    cancelAnimationFrame(this.intervalTimer)
  }
}
复制代码

进行简单测试:

let count = 0
function a() {
  console.log(count)
  count++
}
RAF.setInterval(a, 1000)
复制代码

这里没有实现setTimeout、setInterval的返回值功能,不过返回值功能大多用在清除定时器上,目前提供了clearTimeout和clearInterval的方法,所以返回值可以不必返回。
知乎专栏:叶雨森·前端杂谈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值