美文网首页
译 --为啥不适用setInterval

译 --为啥不适用setInterval

作者: 墨鱼随记 | 来源:发表于2019-07-21 23:05 被阅读0次

最近,我遇到了一个需求是我要隔段时间调用一个函数,类似每隔十秒钟发送一个 ajax 请求.当然,setInterval 看起来是不错的方式.但是我遇到了挫折.

想要理解为啥 setInterval 是不好的,我们需要在脑子里面知道一个知识,那就是 JavaScript 是单线程的.也就是一次只能执行一个操作.

    var fakeCallToServer = function() {
        setTimeout(function() {
            console.log('returning from server', new Date().toLocaleTimeString());
        }, 4000);
    }



    setInterval(function(){ 

        let insideSetInterval = new Date().toLocaleTimeString();

        console.log('insideSetInterval', insideSetInterval);

        fakeCallToServer();
    }, 2000);

//insideSetInterval 14:13:47
//insideSetInterval 14:13:49
//insideSetInterval 14:13:51
//returning from server 14:13:51
//insideSetInterval 14:13:53
//returning from server 14:13:53 
//insideSetInterval 14:13:55
//returning from server 14:13:55

正如你在打印的console.log语句中所看到的那样,setInterval一直在不停地发送ajax调用而不关心先前的调用是否已经返回。

这个会使得很多请求在排队.

现在让我们看下同步请求在 setInterval:

var counter = 0;

var fakeTimeIntensiveOperation = function() {

  for(var i =0;i<50000000;i++) {

   document.getElementById('random');

}

 let insideTimeTakinngFunction = new Date().toLocaleTimeString()



console.log('insideTimeTakingFunction', insideTimeTakingFunction);

}
var timer = setInterval(function(){ 

    let insideSetInterval = new Date().toLocaleTimeString();

    console.log('insideSetInterval', insideSetInterval);

    counter++;
    if(counter == 1){
        fakeTimeIntensiveOperation();
    }

    if (counter >= 5) {
       clearInterval(timer);
    }
}, 1000);

//insideSetInterval 13:50:53
//insideTimeTakingFunction 13:50:55
//insideSetInterval 13:50:55 <---- not called after 1s
//insideSetInterval 13:50:56
//insideSetInterval 13:50:57
//insideSetInterval 13:50:58


我们在这里看到当setInterval遇到时间密集型操作时,它会做两件事情中的任何一件,a 尝试进入轨道或b创建新的节奏。 在Chrome上,它创造了一种新的节奏。

同样,在 setInterval 的代码块里面遇到错误,它不会停止执行而是继续执行错误的代码,需要使用 clearInterval 来停止它.

或者,您可以在时间敏感操作的情况下递归使用setTimeout。

总结

在异步的操作里面,setTimeInterval 会创建一个长长的请求,

原文地址:

https://dev.to/akanksha_9560/why-not-to-use-setinterval--2na9

相关文章

  • 译 --为啥不适用setInterval

    最近,我遇到了一个需求是我要隔段时间调用一个函数,类似每隔十秒钟发送一个 ajax 请求.当然,setInterv...

  • setTimeout代替setInterval的方案

    生产环境下, 我们一般会使用setTimeout代替setInterval,为啥呢?setInterval其实就是...

  • js轮播的bug

    切换标签页setInterval不工作BUG 浏览器有一个BUG,当页面标签切换时,setInterval回不工作...

  • 无线循环函数requestAnimationFrame

    最近在看canvas的时候接触到的这个函数,既然setInterval可以搞定为啥还要用requestAnimat...

  • JS定时器

    定时器 setInterval 与 setTimeout的区别 setInterval setInterval(...

  • 总结3

    1.setTimeout setInterval setInterval 几秒执行一次 setInterval...

  • settimeout()和setInterval()

    settimeout()和setInterval() settimeout() setInterval()里的th...

  • JavaScript setInterval( , );

    JavaScript setInterval(匿名方法 ,时间间隔 ); 例如: setInterval(func...

  • 定时器

    定时器 setInterval(函数,毫秒); 重复执行 clearIntrval(setInterval(函数...

  • setTimeout/setInterval

    setTimeout/setInterval常规使用方法(不带参数) setTimeout/setInterval...

网友评论

      本文标题:译 --为啥不适用setInterval

      本文链接:https://www.haomeiwen.com/subject/torblctx.html