firebug (1.10.1) sugeruje, że javascript nie ogranicza się do pojedynczego wątku w firefox (13.0)
Podczas debugowania javascript po stronie klienta w Firefoksie, wpadłem na coś, co uważałem za dość dziwne i trochę niepokojące. Nie mogłem też powielić tego zachowania podczas debugowania tego samego skryptu za pomocą IE / VS2010.
Stworzyłem prosty przykładowy dokument HTML, aby zilustrować anomalię, którą widzę.
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" type="text/javascript" ></script>
</head>
<body id="main_body">
<script type="text/javascript">
$(function () {
$(".test-trigger").on("click", function () {
loadStuff();
console && console.log && console.log("this will probably happen first.");
});
});
function loadStuff() {
$.get("http://google.com/")
.fail(function () {
console && console.log && console.log("this will probably happen second.");
});
}
</script>
<button class="test-trigger">test</button>
</body>
</html>
Jeśli załadujesz ten dokument do Firefoksa (używam wersji 13.0 z Firebug w wersji 1.10.1 w systemie Windows 7), kliknij test i przejrzyj zakładkę konsoli w Firebug, powinieneś zauważyć, że żądanie pobierania się nie powiedzie (naruszenie zasad między domenami, które nie ma nic zrobić z punktem, który próbuję tutaj zrobić), a potem najprawdopodobniej zobaczysz:
this will probably happen first.
this will probably happen second.
Teraz umieść punkty przerwania w liniach 13 i 20:
13: console && console.log && console.log("this will probably happen first.");
20: console && console.log && console.log("this will probably happen second.");
Jeśli klikniesz ponownie test, przerwiesz wiersz 13 zgodnie z oczekiwaniami. Teraz wznów wykonanie. Jeśli twoje doświadczenie jest jak moje, nie złamiesz się w linii 20. Również po przełączeniu na kartę konsoli zobaczysz następującą sekwencję danych wyjściowych dziennika:
this will probably happen second.
this will probably happen first.
Dla mnie sugeruje to, że program obsługi niepowodzeń żądania ajax jest wykonywany w wątku innym niż ten, w którym wykonywana jest obsługa kliknięcia. Zawsze uważano, że wszystkie javascript dla jednej strony będą wykonywane przez pojedynczy wątek w dowolnej przeglądarce. Czy brakuje mi tutaj czegoś naprawdę oczywistego? Dziękujemy za wgląd w tę obserwację.
Och, jeśli debuguję tę samą stronę uruchomioną w IE przy użyciu Visual Studio, oba punkty przerwania są trafiane tak, jak powinienem.