Зачем нужен async/await в JavaScript
Что проверяют
Понимаете ли вы, что это синтаксис над промисами, а не отдельный механизм. Дальше обычно спрашивают про обработку ошибок и параллельность.
Как отвечать
async/await решает читаемость. Цепочка then с несколькими шагами и ветвлениями превращается в лестницу, а с await код выглядит последовательным, оставаясь асинхронным.
async function loadJob(id) {
try {
const res = await fetch(`/api/jobs/${id}`);
if (!res.ok) throw new Error(res.statusText);
return await res.json();
} catch (e) {
report(e);
return null;
} finally {
hideLoader();
}
}Что важно назвать:
- функция с
asyncвсегда возвращает промис, даже если внутри нет ни одногоawait; awaitждёт разрешения промиса и разворачивает значение, а при отклонении бросает исключение, которое ловится обычнымtry/catch;- под капотом это те же промисы и та же очередь микрозадач, поведение по приоритетам не меняется.
Отдельно про параллельность: await в цикле выполняет запросы последовательно. Если они независимы, нужен Promise.all:
const [user, jobs] = await Promise.all([loadUser(), loadJobs()]);Где спотыкаются
Ставят await подряд для независимых операций и получают сумму задержек вместо максимума.
Забывают, что forEach не ждёт: arr.forEach(async ...) запускает всё и идёт дальше, нужен for...of или Promise.all(arr.map(...)).
Не оборачивают в try/catch и получают необработанное отклонение, которое в Node.js по умолчанию роняет процесс.
Не знают про await на верхнем уровне модуля: в ES-модулях он разрешён и это меняет порядок загрузки.