javascript setInterval()延迟和执行时间之间的冲突

时间:2016-06-09 19:52:37

标签: javascript timer settimeout setinterval

如果执行时间长于使用setInterval()的延迟,有没有办法避免延迟和执行时间之间的冲突?

例如:

setInterval(function(){
  // some code that takes 300 ms to be executed
  // which it's longer than the delay 200 ms
}, 200);

我已经找到了替代方法,即使用setTimeout()进行递归以确保延迟将在函数执行后立即开始,但我的问题是关于setInterval(),而不是替换它setTimeout()

4 个答案:

答案 0 :(得分:1)

我不确定你关注的是什么。

Javascript总是单线程的,这意味着在执行setInterval调用的函数时,不会执行其他函数,也不会重新运行setInterval!

当然,如果在您的setInterval调用函数中使用延迟调用,则可以使该函数完成并再次执行。 为了防止此类问题,您可以使用简单的信号量,如:

var inProcessing = false ;
setInterval(function(){
  // some code that takes 300 ms to be executed
  // which it's longer than the delay 200 ms
     if (!inProcessing){
        inProcessing = true ;
        $http.get(...).then(function(){inProcessing = false;...},
                            function(){inProcessing = false;...});
     }
  }
}, 200); 

答案 1 :(得分:0)

您无法使用setInterval,仅setTimeout执行此操作。如果您的问题是无法轻松取消setTimeout方法,则可以使用以下内容:

var timeout = setTimeout(function runMe(){
    // some code that takes 300 ms to be executed

    timeout = setTimeout(runMe, 200);
}, 200);

// somewhere else

clearTimeout(timeout);

答案 2 :(得分:-1)

您可以使用嵌套的setTimeout代替setInterval。希望你喜欢 ! https://javascript.info/settimeout-setinterval

答案 3 :(得分:-2)

我假设您只想推迟setInterval的一个周期,如果以前的代码中的代码没有完成。

var starts = 0;
var ends = 0;
function myFunc () {
   starts++;
   //doStuff
   ends++;
}

setInterval(function () {
   if (starts === ends) {
      myFunc();
   }
}, 200);