2016-01-22 19 views
0

從我個人理解,因爲JavaScript是單線程的,像一個動作我將如何讓UI線程連續運行

setTimeout(0, function() { alert("Hello"); }); 

不會阻塞UI線程,將等待,直到有一個在UI休息線程,以便它可以「跳入」並運行。這是舊的JavaScript說

「當有什麼可以做,檢查[回調]隊列,但是隻有 檢查時,有什麼可以做的隊列。」

我在說的是,有人能告訴我一個例子,瀏覽器總是有一些事情要做,因此回調隊列中的異步方法永遠不會執行?或者我對事件循環的理解完全扭曲了?

+2

'while(true); //哈哈沒有其他線程可以跳進去了!' – usandfriends

+0

切換到另一個選項卡。 – Teemu

+0

您的示例代碼是borked。你已經把爭論的順序顛倒過來了。此外,最低超時時間因瀏覽器而異。 FireFox使用最低4ms,iirc。也就是說,他們還有一個非標準的'setImmediate()'函數,它儘可能快地將回調排隊。無論如何,如果有東西被無限期地阻止([它肯定是可能的])(http://stackoverflow.com/questions/34954803/how-would-i-make-the-ui-thread-run-continuously#comment57641254_34954803)) ,你遇到了更大的問題...... – canon

回答

2

正如您所指出的,回調是在瀏覽器無事可做時完成的。如果回調從未運行,用戶會認爲瀏覽器不響應。這種可能的情況雖然不太可能被認爲是正常的。

在假設您的超時回調將發生的情況下實現您的代碼是完全正常的。你想做的事情創建一個容忍發生一些時間差異的回調的實現。差異將與處理其他回調和事件花費的最長時間有關。