将clearInterval停止排队间隔执行

时间:2017-11-13 11:49:54

标签: javascript clearinterval

假设我有这些

myInterval=setInterval(funcA,50);

function funcA(){
  //Some code that takes longer than 50ms to run
}

setTimeout(function(){clearInterval(myInterval);},10000}

假设funcA总是花费超过50ms来简化它。当然,许多funcA运行会堆积起来并排队。 clearInterval 会删除那些排队的运行还是停止排队新的?

我确实做了一个小提琴来测试它,结果发现clearInterval会停止所有未来的执行,即使是已经排队的那些。我只需要确认这种行为是否一致(跨浏览器/平台)。

var myInterval=setInterval(funcA,20);

setTimeout(function(){
  clearInterval(myInterval);
  
  console.log('Clearing interval at ' + Date.now());
  
},400);

var lastRunTimeStamp=0;

function funcA(){
  while(Date.now()<lastRunTimeStamp+25){}
  lastRunTimeStamp=Date.now();
  console.log('Run at ' + lastRunTimeStamp);
}
  

- 更新 -

此问题中的排队执行假设不正确,请查看T.J.克劳德回答了解释。

1 个答案:

答案 0 :(得分:5)

  

当然,许多funcA次运行会堆积起来并排队。

不,他们不会,因为重复计时器的工作方式。浏览器中的计时器行为(现在)由WHAT-WG "HTML5" specification指定。在回调完成后,将上一个任务的部分排队,而不是与之分开; details here。因此,一次只会有一个未完成的任务(在它排队之后,在JavaScript引擎可以启动并处理它之前)。

  

clearInterval会删除那些排队的游戏,还是只停止排队?

不*,但它不是必须的。计时器系统排队的任务的第一步是查看计时器是否仍在活动计时器列表中;如果在拨打你的回叫之前它不是the task terminates。所以它好像 clearInterval删除了任务(例如,你之前排队的回调没有运行),但不是因为clearInterval清除了它(相反,它是因为检查了任务)。

很容易测试并证明行为:只需安排一个计时器,然后忙等待的时间超过其间隔,然后清除它:

&#13;
&#13;
var counter = 0;
var timer = setInterval(function() {
  ++counter;
  console.log("timer fired:", counter);
  if (counter == 1) {
    setTimeout(busyWaitAndClear, 0);
  }
}, 500); // Every 500ms
function busyWaitAndClear() { // Obviously never really do this
  var done = Date.now() + 1000;
  while (done < Date.now()) {
    // wait
  }
  clearInterval(timer);
  console.log("timer cleared");
}
&#13;
&#13;
&#13;

请注意,计时器仅触发一次,并且不会再次触发,即使在我们忙碌等待时,可能至少有一个触发它的任务已经排队。

*(&#34;否&#34; - description of clearInterval没有说明读取待处理任务列表和删除按时间间隔排队但尚未获取的任务。)