2012-07-20 14 views
5

Mam bardzo dziwne zachowanie. Mam następujące JQuery:Czy debugger JS zawiesza całą pętlę zdarzeń JS?

myElement.fadeOut(100); 

Występuje jakiś rodzaj wyścigu, tak, że element nie zostanie w końcu ukryty. Jeśli umieściłem debuggera na tej linii i przejdę przez kod, to działa dobrze, a element zanika i zostaje ukryty. Nazwij to jako Heisenbug.

Moje pytanie nie dotyczy stanu wyścigu per se. Chcę wiedzieć, jak to się dzieje, biorąc pod uwagę charakter środowiska wykonawczego JavaScript. Przez mojego zrozumienia następujące predykaty są prawdziwe:

  1. Fadeout() jest realizowany przez JQuery animate()
  2. ożywionej() jest realizowane przez szereg setTimeout() połączeń
  3. setTimeout() harmonogramów realizacją funkcji w kolejka w pewnym momencie
  4. Po dojściu zdarzeń do początku kolejki, funkcja jest wykonywana.
  5. Istnieje tylko jedna pętla zdarzeń, która jest wykonywana sekwencyjnie.
  6. W dowolnym momencie wykonywana jest tylko jedna funkcja/ścieżka przez stację wywoławczą.

Biorąc pod uwagę, że przechodzę przez funkcję w moim debugerze, wykonanie musi zostać zawieszone i nie można wykonywać żadnych innych funkcji.

Nie widzę, jak to możliwe, aby stan wyścigu wystąpił w takich okolicznościach. Czy możesz zasugerować, jak możliwe jest, aby wykonywanie różniło się między debugowanym i nie debugowanym kodem?

Odpowiedz

2

Twoje punkty są poprawne, ale zamiast używa się przeglądarki, jeśli obsługuje ją przeglądarka.

Sesja debugowania może mieć wpływ na zachowanie kodu, jeśli na przykład myElement jest tworzona asynchronicznie przez wywołanie AJAX, ale wywołanie fadeOut() jest wywoływane bez czekania na zakończenie żądania.

W takim przypadku ręczne przejście przez kod może dać wystarczającą ilość czasu na żądanie powrotu, a element, który ma zostać utworzony przed wywołaniem fadeOut(), podczas gdy żądanie nie powróciłoby jeszcze w normalnym przypadku.

+0

Ah wiesz co, jest ładunek ajax. To może być ... – Joe

+0

Skorzystaj z sukcesu lub kompletnego oddzwaniania, a nie limitu czasu, jeśli to się dzieje. Zawsze zakładaj, że ajax może zawiesić się na chwilę. –

+0

Ja na pewno nie użyłem limitu czasu w tym celu! – Joe