2011-03-29 128 views
3

幾年前,我是反對使用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

回答

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); 
} 

...現在​​只會再度它自己的代碼是完整的調用自身,因此,如果它自己的代碼需要更長的時間超過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

-1

它總是最好使用的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