为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

30秒到达战场 2019-05-23 10:53:15
使用requestAnimationFrame实现类似setInterval的计时器
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

供参考,没有实现字符串功能,反正也不推荐使用。
functionsetInterval2(cb,delay,...args){
//记录所有正在运行的interval用于撤销
letpool=window[Symbol.for('IntervalPool')]
if(!pool){
pool={}
window[Symbol.for('IntervalPool')]=pool
}
//interval最低10ms,虽然每frame至少得16ms
delay=delay>=10?delay:10
//intervalid
letticket=Date.now()
//每次interval开始时间
letstartTime=ticket
pool[ticket]=true
loop()
returnticket
functionloop(){
if(!pool[ticket]){return}
constnow=Date.now()
if(now-startTime>=delay){
startTime=now
cb(...args)
}
requestAnimationFrame(loop)
}
}
functionclearInterval2(ticket){
letpool=window[Symbol.for('IntervalPool')]
if(pool&&pool[ticket]){
deletepool[ticket]
}
}
                            
查看完整回答
反对 回复 2019-05-23
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

functiona(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);
}
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 1222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信