setInterval会导致浏览器挂起?

问题描述:

几年前,我是反对使用setInterval了很长一段时间警告说,它理应会导致浏览器挂起,如果被调用函数的运行时间比指定的时间间隔,并随后将无法赶上:setInterval会导致浏览器挂起?

setInterval(function(){ 
    foo = 'bar_' + i++; 
}, 1); 

现在,我知道,在一个循环中添加大量的代码可能会导致浏览器挂起反正,并阻断这样的代码alertpromptconfirm将停止在它的轨道的代码,但有有什么好的理由避免setInterval

注:我知道如何做递归调用setTimeout(因为这是我一直在使用),这个问题是我想弄清楚它是否仍然值得使用它们,或者是否可以安全使用setInterval

+0

Chrome在setInterval方面有问题。请参阅此处:http://code.google.com/p/chromium/issues/detail?id=25892。就我个人而言,我只是使用递归setTimeout(关闭工作很好)。 – 2011-03-29 22:40:29

原因setInterval不好是因为它会尝试每X MS执行代码,无论线程中发生了什么。所以,如果您有:

setInterval(complexFunction, 1); // complexFunction takes >1 MS to complete 

...你可能最终与setInterval尝试之前,即使它自己的代码是完全重新执行几次!但是,你可以使用同样setTimeout和避免这个问题:

setTimeout(complexFunction, 1); 

function complexFunction() { 
    // complex code 
    setTimeout(complexFunction, 1); 
} 

...现在​​只会再度它自己的代码是完整的调用自身,因此,如果它自己的代码需要更长的时间超过1 MS来完成你赢了没有任何积压需要处理,就像setInterval

+0

这与我听到的信息完全相同。是否有任何源代码或演示代码来证明这仍然是一个问题? – zzzzBov 2011-03-29 23:13:50

+0

这取决于代码的复杂性和您需要考虑的浏览器的速度。您可以尝试将任何V8基准测试(http://v8.googlecode.com/svn/data/benchmarks/v3/run.html)放入setInterval,并重复1 ms,看看它如何快速崩溃。 – mVChr 2011-03-29 23:26:48

+2

这是**绝对不正确**。如果浏览器在整个时间间隔内忙于两次间隔,则间隔调用是**丢弃**,不会排队。 [见示例](http://jsfiddle.net/josh3736/CyVdz/) – josh3736 2012-11-12 02:11:59

它总是最好使用的setTimeout在一个循环,让你知道什么时候该继续计时:

foo(); 
function foo(){ 

    setTimeout (function(){ 
     foo = 'bar_' + i++; 
     foo(); 
    }, 1); 

} 

否则你上面说的,浏览器将不得不catch up,自乌拉圭回合循环是无限,它也许不会。

+0

这是**绝对不正确**。如果浏览器在整个时间间隔内忙于两次间隔,则间隔调用是**丢弃**,而不是排队;因此浏览器不会尝试“赶上”。 [见示例。](http://jsfiddle.net/josh3736/CyVdz/) – josh3736 2012-11-12 02:18:21

+0

@ josh3736你甚至** **在你的脚本????!你在十秒后清除间隔! – Neal 2012-11-12 14:02:33

+3

@ josh3736如果他们被丢弃,你会看到旋转数字中的1,3,5等。你在小提琴中没有证明任何东西。 – 2012-11-12 14:16:31