Колбэки, промисы и async/await
Вопрос
Расскажи, как эволюционировала асинхронность в Node.js: колбэки, промисы, async/await. Что под капотом у await?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Колбэки error-first: просто, но вложенность и легко потерять ошибку
Промисы: цепочки, единая обработка ошибок, комбинаторы all/allSettled/race/any
async/await: синтаксис над промисами, код читается как синхронный, try/catch
await приостанавливает только свою функцию, продолжение идёт микрозадачей
async-функция всегда возвращает промис
util.promisify и промис-версии модулей (fs/promises)
Что могут спросить следом
- Что будет с ошибкой, если забыть await?
- Как выполнить запросы параллельно с async/await?
Разбор
Сначала в Node были колбэки по соглашению error-first: первый аргумент ошибка, второй результат. Это просто, но вложенные операции превращаются в пирамиду, а каждую ошибку надо проверять вручную.
Промисы дали объект-результат будущей операции. Их можно возвращать, строить цепочки, ловить ошибки в одном catch и комбинировать через Promise.all, allSettled, race и any.
async/await это синтаксис поверх промисов. async-функция всегда возвращает промис, а await приостанавливает только её: продолжение функции ставится в очередь микрозадач, когда промис выполнится. Поток при этом свободен и обслуживает другие запросы. Ошибки ловятся обычным try/catch.
Старые колбэк-API я превращаю в промисы через util.promisify, но обычно хватает готовых модулей вроде fs/promises.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.