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

Всегда ли в асинхронном коде лежит синхронный?

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

Да, в асинхронном коде всегда есть синхронная часть: асинхронные операции запускаются синхронно, и код между точками ожидания выполняется синхронно.

Асинхронность строится на синхронном коде

Любая асинхронная операция инициируется синхронно, а её результат обрабатывается позже:

console.log('1');                          // синхронно
setTimeout(() => console.log('3'), 0);     // запуск синхронный, коллбэк — позже
console.log('2');                          // синхронно
// 1, 2, 3

Строки console.log('1'), setTimeout(...), console.log('2') выполняются синхронно; асинхронен только коллбэк.

В async/await

async function load() {
  console.log('старт');           // синхронно
  const data = await fetch(url);  // до await — синхронно, после — микрозадача
  console.log('готово');          // асинхронно (после разрешения)
}

Код до первого await выполняется синхронно; функция возвращает промис.

Executor промиса — синхронный

new Promise((resolve) => {
  console.log('исполнитель'); // синхронно, сразу при создании
  resolve();
});

Вывод

Асинхронность не отменяет синхронное выполнение — она добавляет отложенные части поверх синхронного потока. «Чисто асинхронного» кода без синхронной инициации не бывает.

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

Да: асинхронный код всегда содержит синхронную часть — асинхронные операции запускаются синхронно, executor промиса и код до первого await выполняются синхронно, а откладываются только коллбэки/продолжения. Асинхронность надстраивается над синхронным потоком.

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