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

javascript setInterval() collision between the delay and execution time

如果执行时间长于使用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()

如果之前 运行 的代码不完整,我假设您只是想推迟 setInterval 的循环。

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

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

您不能使用 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);

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

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); 

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