firebug (1.10.1) предполагает, что javascript не ограничен одним потоком в firefox (13.0)
Во время отладки некоторого клиентского javascript сегодня в Firefox я столкнулся с чем-то, что я нашел довольно странным и немного расстраивающим. Кроме того, я не смог продублировать это поведение при отладке того же скрипта в IE / VS2010.
Я создал простой пример HTML-документа, чтобы проиллюстрировать аномалию, которую я вижу.
<!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>
Если вы загрузите этот документ в Firefox (я использую версию 13.0 с Firebug версии 1.10.1 в Windows 7), нажмите кнопку «Тест» и просмотрите вкладку консоли в Firebug, вы должны заметить, что запрос get завершается неудачно (междоменное нарушение, которое не имеет никакого отношения к с пунктом, который я здесь пытаюсь сделать), и тогда вы, скорее всего, увидите:
this will probably happen first.
this will probably happen second.
Теперь разместите точки останова в строках 13 и 20:
13: console && console.log && console.log("this will probably happen first.");
20: console && console.log && console.log("this will probably happen second.");
Если вы нажмете кнопку «Тест» еще раз, вы окажетесь в строке 13, как и ожидалось. Теперь возобновите выполнение. Если ваш опыт похож на мой, вы не прервете строку 20. Также, если вы перейдете на вкладку консоли, вы увидите следующую последовательность вывода журнала:
this will probably happen second.
this will probably happen first.
Для меня это говорит о том, что обработчик сбоя запроса ajax выполняется в потоке, отличном от того, в котором выполняется обработчик щелчка. Я всегда верил, что весь javascript для одной страницы будет выполнен одна нить в любом браузере. Я что-то упускаю здесь действительно очевидное? Спасибо за понимание этого наблюдения.
О, если я отлаживаю одну и ту же страницу, работающую в IE, используя Visual Studio, обе точки останова достигаются, как я и ожидал