2012-10-04 33 views
2

這不僅僅是一個問題,它是一個確保Javascript超時功能的服務質量(QoS)的請求。Javascript超時 - 規範

望着下面的僞代碼:

.. start something in JS after a user action 
    .. some js code 
    setTimeout(function() { doSomething }, 1); 
    .. continue for longer than 1ms doing something 
    .. end code for user action 

    .. after 

    .. execute doSomething 

,我們可以肯定地說在所有主要的瀏覽器,超時的代碼的代碼已經處理第一用戶行爲之後做了什麼?這與延遲時間無關。

延遲時間並不重要,事實上doSomething代碼是在執行之後執行的。

0延遲會發生什麼?

預先感謝您在不同瀏覽器上的體驗。

回答

4

由於Javascript的單線程特性,異步事件「fires」與實際執行時不同。

正在評估的每個代碼塊都在內部表示爲任務隊列中的任務。因此,讓我們假設在給定的代碼塊中間,異步事件通過setTimeout()準備好執行。如果延遲時間足夠短,實際上沒有任何東西阻止它在「同步」代碼的其餘部分完成執行之前「開火」。然而,「觸發」並不意味着處理器實際上中斷並執行。這只是意味着它變成了任務隊列中的任務。實際執行仍然需要等到它從任務隊列中彈出,並且直到原始代碼塊完成後才能執行。

下面是一個HTML5規範片斷,而不是權威當然所有的瀏覽器,是HTML5,是說明性的:

http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#processing-model-3

第一的主事件循環中定義有7個步驟是:

  1. 在事件循環的任務隊列的一個運行的最古老的任務,而忽略其任務相關聯的文檔並不完全有效[...]

請注意,這第一步是原子。任務必須在環境重置並接下來的任務完成之前完成。

也看看約翰Resig的職位上這一點: http://ejohn.org/blog/how-javascript-timers-work/

所以,WRT你的問題:

,我們可以肯定地說在所有主要的瀏覽器超時的代碼之後完成處理第一個用戶操作的代碼。這與延遲時間無關。

...答案是肯定的,我們可以肯定。 (在香草案例中...我假設我們只是在談論傳統的單一/ UI線程,而不是談論Web Workers的處理)。另外,雖然你確實提到過你並不在意延遲時間本身,但你也可能有興趣注意「鉗制時間」(強制最小延遲),它似乎是de facto standardized at around 4ms

+1

感謝關於「鉗時間」的說明。對於學習總是有一些有趣和新的東西。 –

+1

令人印象深刻的答案,謝謝。只是稍微等一下接受它 – ic3