Проблема в том, что console.log
не всегда так синхронно, как можно подумать.Спецификация требует только, чтобы console.log
отображало сообщение в консоли разработчика, но не предъявляет никаких требований о том, как и когда сообщение будет отображаться.В зависимости от вашего браузера результаты могут отличаться, однако обычно в нем реализовано что-то вроде следующего:
- Когда вы делаете вызов на
console.log
, запрос помещается в стек (поэтому последовательные вызовы на console.log
всегда выполняется по порядку) - В следующем кадре анимации браузер попытается обработать как можно большую часть стека (минимум один элемент в стеке должен обрабатывается, поэтому браузер может заблокироваться, если вы попытаетесь заблокировать 8 мегабайт данных)
- «Обработка» стека включает в себя такие вещи, как преобразование ссылок на элементы DOM в ссылки, которые перенесут вас в другое место консоли dev,преобразование объектов JSON в элементы навигации и складные элементы пользовательского интерфейса или замена объектов текстом «[Object object]»
- После обработки элемента в стеке его необходимо отобразить в консоли.Для этого необходимо отрегулировать высоту консоли, определить, нужна ли вам полоса прокрутки, определить, где текст будет переноситься, и т. Д. Этот процесс (получение того, что вы хотите в консоли и фактически отображение его на экране) называется «рисованием»
Поскольку console.log
на самом деле является такой сложной операцией, как эта, она может не завершиться до выполнения оператора alert
(в некоторых браузерах).Заменив каждый вызов alert
на console.log
или каждый вызов console.log
на alert
, вы должны увидеть, что все выполняется в ожидаемом порядке.