> Что такое проваливание промисов (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
// Явное отклонение через reject
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('Ошибка загрузки данных'));
}, 1000);
});
promise
.then(data => console.log(data))
.catch(error => console.error('Поймана ошибка:', error.message));
// Неявное отклонение через throw
const 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(), что усложняет отладку.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью