Получить доступ

Как работают async и await и как правильно обрабатывать в них ошибки?

JuniorАсинхронность и event loop
Ещё спрашивают так:
  • Как выполнить несколько запросов параллельно с await?
Коротко

async-функция всегда возвращает Promise; await приостанавливает её до завершения промиса, не блокируя поток (продолжение — микрозадача). Ошибки ловят обычным try/catch. Независимые запросы запускают одновременно: сначала создать промисы, потом await Promise.all.

  • await в цикле for — последовательно; для параллельности — map + Promise.all
  • forEach с async-колбэком не ждёт завершения
  • Забытый await — функция идёт дальше, а ошибка уходит в unhandledrejection

А ещё Top-level await доступен в ES-модулях

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

Event loop: стек, микро- и макрозадачи

Подробно

Что делает await. Если значение — промис, функция приостанавливается, а продолжение ставится в очередь микрозадач после его завершения. Поток при этом свободен для других задач.

fetch не бросает на HTTP-ошибки — 404 и 500 приходят как успешный ответ, проверять res.ok. Бросает только при сетевой ошибке и отмене.

Циклы: for...of с await — последовательная обработка (иногда нужна, чтобы не перегрузить сервер); forEach(async ...) — запускает всё и не ждёт; для ограниченного параллелизма — пачки или библиотека p-limit.

Отмена: AbortController и signal в fetch; при размонтировании компонента отменять незавершённые запросы.

Пример

// медленно: запросы по очереди
const user = await fetchUser(id);
const orders = await fetchOrders(id);

// быстро: одновременно
const [user2, orders2] = await Promise.all([fetchUser(id), fetchOrders(id)]);

async function load() {
  try {
    const res = await fetch("/api/data");
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    return await res.json();
  } catch (e) {
    showError(e);
  }
}

Что хотят услышать

  • Связь async/await с промисами.
  • try/catch и проверка res.ok.
  • Последовательные и параллельные запросы.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем