用setTimeout延时器代替setInterval定时器
今天有个需求,要求前端有个心跳机制,每十秒访问一个指定接口,想到权威指南里一直有提过setTimeout好于setInterval,就磨刀霍霍向代码了。
第一版 为了测试,时间改为1秒了
t_:number;
const that = this;
setTimeout(function test(){
that.http.query(/api/heart_beat, {
}).subscribe(res => {
if(res){
// 书上写的arguments.callee,后来查了一下说现在已经不用了
// 就给内部函数命名一下就可以了,这里就是test
that.t_ = setTimeout(test, 1000);
console.log(that.t_);
}
});
},1000)
// 组件销毁的时候就取消了定时器
ngOnDestroy(){
console.log(this.t_);
clearTimeout(this.t_);
}
后来经过前辈提醒,如果多次刷新页面就设置了多个,处理方式就是把延时器存session里,判断是否创建了,这样就可以避免这个问题了,且有多个地方调用了退出,所以应该还有个公共方法来清空延时器。
目前版
最主要改动的地方
// 设置心跳
if(!sessionStorage.getItem(heart)){
const that = this;
setTimeout(function test(){
that.http.query(/api/heart_beat, {
}).subscribe(res => {
if(res){
that.t_ = setTimeout(test, 1000);
sessionStorage.setItem(heart,that.t_.toString(10));
}
});
},1000);
}
书上说setInterval的问题有这两点 可能会被跳过,因为它是过了定时的时间才把任务放入队列,如果有其他任务在执行,就会导致任务延后。 目前这么写,万能的网友会有更好的方法。
工作上的总结,希望能帮助到大家。
