PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Как асинхронность влияет на несовпадение результата в консоли и вызванного кода?

Асинхронность и Event Loop

Асинхронность влияет на несовпадение порядка в консоли так: синхронный код выполняется сразу и выводится первым, а асинхронные коллбэки — позже, поэтому вывод не совпадает с порядком строк в коде.

Почему возникает несовпадение

Асинхронные операции (setTimeout, промисы, запросы) не выполняются в момент вызова — их коллбэки откладываются и выполняются позже через Event Loop. Синхронный код выполняется сразу:

console.log('1');                          // синхронно
setTimeout(() => console.log('2'), 0);     // коллбэк отложен
Promise.resolve().then(() => console.log('3')); // отложен (микрозадача)
console.log('4');                          // синхронно

// Вывод: 1, 4, 3, 2 — НЕ по порядку строк!

Порядок объясняется Event Loop

  1. Синхронный код по порядку: 1, 4.
  2. Микрозадачи (Promise): 3.
  3. Макрозадачи (setTimeout): 2.

Поэтому строка 2 в коде выводится последней, хотя написана раньше 4.

Частая ловушка

async function load() {
  const data = await fetch(url);   // асинхронно
  console.log('данные:', data);    // выполнится позже
}
load();
console.log('после вызова');       // выполнится РАНЬШЕ "данные"

после вызова выведется раньше, чем данные, хотя написано после load().

Как понимать

  • Синхронный код — сразу, по порядку.
  • Асинхронные коллбэки — позже (микрозадачи → макрозадачи).
  • Вывод в консоли отражает порядок выполнения, а не порядок строк.

Коротко для собеседования

Асинхронность вызывает несовпадение: синхронный код выполняется и выводится сразу, по порядку, а асинхронные коллбэки (setTimeout, промисы) откладываются и выполняются позже через Event Loop (микрозадачи → макрозадачи). Поэтому вывод в консоли отражает порядок выполнения, а не порядок строк в коде (1, 4, 3, 2).

Другие вопросы раздела