2013-04-24 36 views
0

,如果我這樣做:使用Javascript - 運行時的優先級和隊列

setTimeout(function(){ alert('antani'); },400); 
    setTimeout(function(){ alert('supercazzola'); },400); 

爲什麼這個腳本生成這兩個超時之間的隊列?

他們不應該在同一時刻提醒嗎?

正如我所看到的那樣,首先執行第一個警報,然後執行第二個警報。

+0

試試看:http://www.w3schools.com/js/tryit.asp?filename=tryjs_timing1 – WheretheresaWill 2013-04-24 10:37:11

+0

@Wheretheresa將會發生同樣的超時衝突,並且只執行第一次超時,但是爲什麼:) – sbaaaang 2013-04-24 10:38:40

+1

不,他們兩者都爲我執行。 – WheretheresaWill 2013-04-24 10:43:33

回答

1

背景

JavaScript有隻有解釋器正在運行的一個線程。這意味着事件不會在同一時間處理。當你設置一個超時時,你實際上訂閱瀏覽器的一些內部事件,每次瀏覽器處於空閒模式時(當不忙於渲染,解析或執行某些腳本等)時觸發該事件。此事件的處理程序以及計劃的時間將根據腳本中顯示的訂單setTimeout發佈到隊列中。每當這個內部事件被觸發時,瀏覽器檢查每個處理程序,並決定是否執行並從隊列中刪除它或跳過它。

同一時間

當您計劃任務之一,先後與同一估計時間

setTimeout(function(){ $('.element').hide(); },400); 
setTimeout(function(){ $('.element').show(); },400); 

.element將首先被隱藏,然後顯示。請注意,這並不意味着瀏覽器在隱藏後會將更改顯示爲.element。大多數瀏覽器只會在腳本執行完成後渲染。

不同時間

當您計劃任務,不同的估計時間:

setTimeout(function(){ $('.element').hide(); },401); 
setTimeout(function(){ $('.element').show(); },400); 

結果可能是不可預測的。可能會出現以下情況:

  • 更多或等於400且小於401毫秒過去了,瀏覽器開始處理事件處理程序。在這種情況下,.element將首先顯示,然後隱藏。請注意,在400毫秒之後可能會有其他setTimeout計劃執行,並且它們將在隱藏.element之前運行。

  • 在第一次開始處理事件處理程序之前,瀏覽器忙於401毫秒或更長時間。在這種情況下,最有可能(取決於瀏覽器實現).element將首先被隱藏然後顯示,儘管根據估計時間它應該反之亦然!

關於你的問題:是它與同一時間或一些積極三角洲答案是NO 設置超時相同。這是不一樣的,當你用增量設置超時時,它們之間總有可能會處理另一個事件或超時。

1

請閱讀:http://ejohn.org/blog/how-javascript-timers-work/

這裏有一個類似的例子:

功能(){

var num = 5; 
    console.log(++num); 
    setTimeout(a, 100); 
}; 
setTimeout(a,2000); 

按照時間順序:

要定義函數,而無需調用它

你正在調度一個兩秒後調用:setTimeout的(一,2000)

它被稱爲

當經過100毫秒

調用時,它的時間表本身調用

您的代碼基本上睡2秒鐘,然後執行一個有100毫秒的暫停[*]。

但是通過您的上下文判斷你所要求的是在下列情況下的優先級:

setTimeout(a, 2000); 
setTimeout(b, 100); 

那麼,最有可能的B將被首先調用(假設第一線和第二線之間不存在不可預知的停頓,例如由於整體OS性能問題)。

如果使用相同的超時:

setTimeout(a, 100); 
setTimeout(b, 100); 

一個將最有可能首先被調用。但是我不認爲這是有保證的,取決於JS引擎(是否使用了即將發生的事件嚴格的FIFO列表,什麼是內部時鐘分辨率等)

+0

+1謝謝exaplanation,爲了更好的解釋,我的明確問題是:**函數a很可能會首先被調用,但爲什麼?** – sbaaaang 2013-04-24 10:41:28

+0

謝謝,我認爲所有的JS引擎都是公平的。它很難唯一的方式來測試這將是所有不同的瀏覽器在不同的操作系統,我會說。 – LmC 2013-04-24 10:44:06