几年前我被警告不要长时间使用setInterval,因为如果被调用的函数运行时间超过指定的时间间隔,它会导致浏览器挂起,然后就无法赶上:
setInterval( function(){
foo = 'bar_' + i++;
}, 1 );
现在,我知道在循环中添加大量代码可能导致浏览器无论如何都会挂起,而阻止代码如alert,prompt和confirm将会阻止代码进入其轨道,但有没有充分的理由避免使用setInterval ?
注意:我知道如何进行递归的setTimeout调用(就像我一直在使用的那样),这个问题是我试图弄清楚它是否仍然值得使用它们,或者是否可以安全地使用setInterval.
解决方法:
setInterval不好的原因是因为无论线程中发生了什么,它都会尝试每X MS执行一次代码.所以如果你有:
setInterval( complexFunction, 1 ); // complexFunction takes >1 MS to complete
…你可能最终会尝试重新执行setInterval,甚至在它自己的代码完成之前!但是,您可以类似地使用setTimeout并避免此问题:
setTimeout( complexFunction, 1 );
function complexFunction() {
// complex code
setTimeout( complexFunction, 1 );
}
…现在,complexFunction只有在自己的代码完成后才会再次调用自身,所以如果自己的代码需要超过1 MS才能完成,那么就像setInterval一样,不会有任何积压处理