Javascript clearInterval是否会停止排队的间隔执行

Javascript clearInterval是否会停止排队的间隔执行,javascript,clearinterval,Javascript,Clearinterval,假设我有这个 myInterval=setInterval(funcA,50); function funcA(){ //Some code that takes longer than 50ms to run } setTimeout(function(){clearInterval(myInterval);},10000} 比方说,funcA总是需要超过50毫秒的时间来简化。当然,许多funcA运行将堆积起来并排队。clearInterval会删除那些排队的运行吗还是停止对新运行进

假设我有这个

myInterval=setInterval(funcA,50);

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

setTimeout(function(){clearInterval(myInterval);},10000}
比方说,funcA总是需要超过50毫秒的时间来简化。当然,许多funcA运行将堆积起来并排队。clearInterval会删除那些排队的运行吗还是停止对新运行进行排队

我确实做了一个测试,结果是clearInterval停止了所有未来的执行,甚至那些已经排队的执行。我只需要确认这种行为是一致的(跨浏览器/平台)

var myInterval=setInterval(funcA,20);
setTimeout(函数(){
clearInterval(myInterval);
log('Date.now()处的清除间隔);
},400);
var lastRunTimeStamp=0;
函数funcA(){
while(Date.now()
当然,许多
funcA
运行将堆积起来并排队

不,不会,因为重复计时器的工作方式。浏览器中的计时器行为(现在)由指定。将下一个任务作为上一个任务的一部分,在回调完成后完成,而不是单独完成。因此,一次只会有一个未完成的任务(在它排队之后,JavaScript引擎可以提取并处理它之前)

clearInterval
会删除那些排队的运行还是停止排队新的运行

否*,但不必。计时器系统排队的任务的第一步是查看计时器是否仍在活动计时器列表中;如果不在,则在调用回调之前查看。因此,就好像
clearInterval
删除了任务(例如,以前排队的回调没有运行),但不是因为
clearInterval
清除了它(而是因为任务已检查)

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

var计数器=0;
var timer=setInterval(函数(){
++计数器;
日志(“计时器触发:”,计数器);
如果(计数器==1){
设置超时(busyWaitAndClear,0);
}
},500);//每500毫秒
函数busyWaitAndClear(){//显然从未真正执行此操作
var done=Date.now()+1000;
while(完成>日期.现在()){
//等等
}
清除间隔(计时器);
控制台日志(“计时器清除”);

}
Bonus question:你知道为什么这个行为没有明确的文档记录(至少在我看的地方)?很有趣。这里的程序是什么(对于一个基于错误前提的问题)?我应该以某种方式修复它,甚至删除它吗?@RSinohara:其他人可能也有错误的假设,所以我会说保持原样。(此外,改变问题,使现有答案无效,这是非常不赞成的。)@RSinohara:FWIW,我还纠正了答案中的一个错误,并添加了一些细节和测试方法。非常有趣,将clearInterval放在回调中是证明的关键。非常好。不过,你有没有关于未实现此标准的浏览器的数据?