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

Как отработает вложенный Async/Await?

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

Вложенный async/await выполняется последовательно: внешний `await` ждёт завершения внутренней async-функции (со всеми её `await`) перед продолжением. Каждый `await` приостанавливает выполнение.

Как выполняется вложенный async/await

Внешняя функция ждёт полного завершения внутренней:

async function inner() {
  console.log('inner start');
  await delay(100);
  console.log('inner end');
  return 'результат';
}

async function outer() {
  console.log('outer start');
  const result = await inner(); // ждёт inner ПОЛНОСТЬЮ (включая её await)
  console.log('outer end', result);
}

outer();
// outer start → inner start → inner end → outer end результат

await inner() приостанавливает outer, пока inner не завершится со всеми своими await.

Последовательность (не параллельность)

Вложенные/последовательные await выполняются по очереди:

const a = await fetchA(); // сначала это
const b = await fetchB(); // потом это (ждёт a)
// суммарное время = A + B

Для параллельности — Promise.all

const [a, b] = await Promise.all([fetchA(), fetchB()]);
// одновременно, время = max(A, B)

Микрозадачи

Каждый await ставит продолжение в очередь микрозадач:

async function fn() {
  console.log('1');
  await null;         // здесь — точка возобновления (микрозадача)
  console.log('3');
}
fn();
console.log('2');
// 1, 2, 3

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

Вложенный async/await выполняется последовательно: внешний await ждёт полного завершения внутренней async-функции со всеми её await, прежде чем продолжить. Последовательные await идут по очереди (время суммируется) — для параллельности используют Promise.all. Каждый await ставит продолжение в микрозадачу.

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