Этот вопрос проверяет понимание обработки ошибок в промисах JavaScript, что необходимо для написания надёжного асинхронного кода.
Промисы (Promises) в JavaScript представляют собой механизм для работы с асинхронными операциями. Они могут находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнено успешно) и rejected (выполнено с ошибкой). Метод .catch() — это специальный обработчик, который вызывается именно при переходе промиса в состояние rejected.
reject.then возникает ошибка, которая не перехвачена try...catch.catch перехватывает ошибки из любого промиса, расположенного выше в цепочке вызовов.Рассмотрим код, демонстрирующий разные сценарии:
// 1. Явный reject
const promise1 = new Promise((resolve, reject) => {
reject(new Error('Что-то пошло не так'));
});
promise1.catch(err => console.log('Сценарий 1:', err.message));
// 2. Необработанная ошибка
const promise2 = new Promise((resolve, reject) => {
throw new Error('Синхронная ошибка');
});
promise2.catch(err => console.log('Сценарий 2:', err.message));
// 3. Ошибка в цепочке then
Promise.resolve()
.then(() => {
throw new Error('Ошибка в then');
})
.catch(err => console.log('Сценарий 3:', err.message)); // Сработает
// 4. Успешное выполнение — catch игнорируется
Promise.resolve('Успех')
.then(msg => console.log(msg))
.catch(err => console.log('Это не выполнится'))
.then(() => console.log('Цепочка продолжается'));Важно помнить, что catch возвращает новый промис. Это позволяет строить длинные цепочки обработки, где после исправления ошибки можно продолжить выполнение.
Вывод: Используйте .catch() для централизованной обработки всех возможных ошибок в асинхронных операциях. Это делает код чище и предотвращает "тихие" падения приложения. Всегда добавляйте catch в конец цепочки промисов, чтобы ни одна ошибка не осталась необработанной.