Ответ вслух Junior Промисы и async/await спрашивают часто обновлено

Колбэки, промисы и async/await

Вопрос

Расскажите, как эволюционировала асинхронность в JavaScript: колбэки, промисы, async/await. Что каждый шаг решил?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Сначала были колбэки: функция принимает обработчик и вызывает его, когда готово. Проблемы: глубокая вложенность при последовательных шагах, обработка ошибок в каждом колбэке отдельно и инверсия контроля, мы отдаём чужому коду право вызвать наш колбэк когда угодно и сколько угодно раз.

Что должно прозвучать в ответе

  • Колбэки: вложенность, разрозненная обработка ошибок, инверсия контроля

  • Промисы: объект-результат, цепочки, единый `catch`, гарантия одного вызова

  • `then` возвращает новый промис, значение или ошибка передаётся по цепочке

  • Комбинаторы `all`, `allSettled`, `race`, `any` для групп операций

  • async/await: синтаксис поверх промисов, `try/catch`, читается как синхронный код

  • Подводные камни: последовательные await вместо параллельных, забытый await, необработанные отклонения

Что могут спросить следом

  • Что такое инверсия контроля в колбэках?
  • Как выполнить три запроса параллельно и собрать результаты, даже если часть упала?
  • Почему await внутри forEach не ждёт?

Разбор

Образцовый ответ: «Сначала были колбэки: функция принимает обработчик и вызывает его, когда готово. Проблемы: глубокая вложенность при последовательных шагах, обработка ошибок в каждом колбэке отдельно и инверсия контроля, мы отдаём чужому коду право вызвать наш колбэк когда угодно и сколько угодно раз. Промисы сделали результат объектом: его можно передавать, у него одно финальное состояние, обработчики вызываются ровно один раз и асинхронно. then возвращает новый промис, поэтому вложенность превращается в плоскую цепочку, а один catch в конце ловит ошибку любого шага. Для групп операций есть комбинаторы: all, allSettled, race, any. Async/await это синтаксис над промисами: код читается сверху вниз, ошибки ловит обычный try/catch. Но есть ловушки: последовательные await там, где запросы независимы и их надо запускать через Promise.all; await в forEach, который не ждёт; и отклонения без обработчика, которые в Node роняют процесс».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме