> Что такое проваливание промисов (Promise rejection) в JavaScript (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Aston
Стек: JavaScript
> Пример ответа
Короткий ответ
Проваливание промисов (Promise rejection) - это механизм в JavaScript, который сигнализирует об ошибке или неудачном завершении асинхронной операции. Когда промис отклоняется, он переходит в состояние rejected и вызывает колбэк, переданный в метод .catch() или второй аргумент .then(). Это позволяет обрабатывать ошибки в асинхронном коде аналогично try/catch для синхронного.
Подробное объяснение
Promise rejection - это способ сообщить, что асинхронная операция завершилась с ошибкой. Промис может находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнен успешно) и rejected (отклонён). Отклонение происходит явно через вызов reject() в конструкторе Promise или неявно при выбрасывании исключения (throw) внутри обработчика.
При отклонении промиса управление передаётся в ближайший .catch() в цепочке. Если .catch() отсутствует, возникает необработанное отклонение (unhandled rejection), которое в современных средах (Node.js, браузеры) приводит к предупреждению или ошибке. Это важно для предотвращения "проглатывания" ошибок.
На практике
В реальных проектах rejection используется для обработки ошибок HTTP-запросов, неудачных операций с файлами, валидации данных и других асинхронных сценариев. Важно всегда добавлять .catch() в конец цепочки промисов или использовать async/await с try/catch. В современных приложениях также применяют глобальные обработчики unhandledrejection (браузеры) или process.on('unhandledRejection') (Node.js) для логирования.
Пример кода
JAVASCRIPT// Явное отклонение через rejectconst promise = new Promise((resolve, reject) => {setTimeout(() => {reject(new Error('Ошибка загрузки данных'));}, 1000);});promise.then(data => console.log(data)).catch(error => console.error('Поймана ошибка:', error.message));// Неявное отклонение через throwconst asyncFunction = async () => {throw new Error('Что-то пошло не так');};asyncFunction().catch(err => console.error(err.message));
Как отвечать на собеседовании
Начни с определения: rejection - это состояние промиса при ошибке. Объясни, что это аналог throw для асинхронного кода. Упомяни, что отклонение можно обработать через .catch() или try/catch с async/await. Приведи простой пример с reject() и покажи, как ловить ошибку. Подчеркни важность обработки всех отклонений, чтобы избежать необработанных rejection'ов.
Что проверяет интервьюер
Интервьюер оценивает понимание жизненного цикла промиса, различие между reject и throw, умение правильно обрабатывать ошибки в асинхронном коде. Также проверяется знание последствий необработанных rejection'ов и способов их предотвращения. Для junior достаточно базового понимания механизма и синтаксиса.
Типичные ошибки
- Забывать добавлять
.catch()в цепочку промисов, что приводит к необработанным rejection'ам. - Путать
rejectсresolveили думать, чтоthrowвнутри промиса не вызывает отклонение. - Пытаться использовать
try/catchс промисами безasync/await- это не работает, так какtry/catchсинхронный. - Не передавать ошибку как объект Error в
reject(), что усложняет отладку.
> Похожие задачи по frontend
Что такое Zustand и как он используется
Что такое гидрация в веб-разработке
Что произойдет при прямой мутации состояния в редьюсере Redux
Как повесить обработчик на резолв каждого промиса в массиве для реализации any?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью