前端周期性逻辑脚本,应谨慎使用setInterval 它会以时间轴(但是又卡不准)固定周期性地执行脚本,比如调用接口更新页面。
假设5秒周期,但是你的接口突然抽风,3秒才返回,那么再过2秒,下一个周期又到了,这与一般意义上间隔5秒刷新的诉求是违背的。
如果接口情况更糟糕,超过了5秒,那么上一次还没执行完,下一次又开始了,这在绝大多数的业务场景下是不合适的,甚至是错误的!
使用如下方式优化
(function(){
try{
//TODO: something
}finally{
setTimeout(arguments.callee,5000);
}
})
以这种形式来实现周期性逻辑,会正确地实现“间隔“的周期,并且,在异步逻辑,比如接口调用是。应该在Promise链的最后一步,发起setTimeout重新安排下一次的周期
另外,arguments.callee已经过时被弃用了,访问arguments 是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建,会很大程度下影响浏览器的性能,这样使用的问题更大。
所以,应该这样改进
(function fn(){
try {
// TODO: something
} finally {
setTimeout(fn, 5000);
}
})