用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的问题有这两点 可能会被跳过,因为它是过了定时的时间才把任务放入队列,如果有其他任务在执行,就会导致任务延后。 目前这么写,万能的网友会有更好的方法。

工作上的总结,希望能帮助到大家。

经验分享 程序员 微信小程序 职场和发展