2012-07-20 90 views
5

我有一些非常奇怪的行爲正在進行。我有以下jQuery:JS調試器是否暫停整個JS事件循環?

myElement.fadeOut(100); 

有一些種族情況正在發生,使元素不會最終隱藏。如果我在該行上放置了一個調試器並逐步完成代碼,那麼它可以正常工作,並且元素會淡出並隱藏起來。稱它爲Heisenbug

我的問題不在於比賽條件本身。鑑於JavaScript運行時的性質,我想知道如何發生這種情況。按照我的理解如下謂詞爲真:

  1. 淡出()由JQuery的動畫()
  2. 動畫()實現是由一系列的setTimeout()電話
  3. setTimeout()調度函數在執行實施某個時間點的隊列
  4. 當事件到達隊列的開始位置時,將執行該功能。
  5. 只有一個事件循環,按順序執行。
  6. 在任何給定的時間點,只有一個通過調用堆棧的函數/路徑正在執行。

鑑於我正在逐步調試我的調試器中的函數,所以必須暫停執行,並且不能執行其他函數。

我看不出在這種情況下出現競態條件的可能性。 您能否建議執行的調試代碼和非調試代碼之間有何不同?

回答

2

您的項目符號是正確的,除了使用requestAnimationFrame()而不是setTimeout()(如果瀏覽器支持它的話)。

如果例如通過AJAX調用異步創建myElement,但調用​​而不等待請求完成,調試會話可能會影響代碼的行爲。

在這種情況下,手動逐句通過代碼可以給請求返回足夠的時間,並且調用​​之前創建的元素,而在正常情況下請求不會返回。

+0

啊,你知道嗎,有一個阿賈克斯負載。這可能是... – Joe 2012-07-20 14:08:13

+0

使用成功或完成回調,而不是超時,如果這是怎麼回事。總是假設阿賈克斯可能會掛一點點。 – 2012-07-20 14:10:13

+0

我當然沒有爲此目的使用超時! – Joe 2012-08-15 14:38:02