Всегда ли в асинхронном коде лежит синхронный?
Асинхронность и 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 выполняются синхронно, а откладываются только коллбэки/продолжения. Асинхронность надстраивается над синхронным потоком.