几年前,我被警告不要长时间使用setInterval
,因为如果调用的函数运行时间长于指定的时间间隔,它会导致浏览器挂起,然后就无法捕获起来:
setInterval( function(){
foo = 'bar_' + i++;
}, 1 );
现在,我知道在循环中添加大量代码可能会导致浏览器无论如何都挂起 ,并阻止代码alert
,prompt
和confirm
会停止代码跟踪,但有没有充分理由避免setInterval
?
注意:我知道如何进行递归setTimeout
调用(就像我一直在使用的那样),这个问题是我试图弄清楚它是否值得使用它们,或者{{1可以安全使用。
答案 0 :(得分:17)
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
答案 1 :(得分:-1)
最好在循环中使用setTimeout,以便准确知道何时继续计时:
foo();
function foo(){
setTimeout (function(){
foo = 'bar_' + i++;
foo();
}, 1 );
}
否则如上所述,浏览器必须catch up
,因为你的循环是无限的,它可能不是。