Що робить catch() у промісах?
1. Що робить .catch()
.catch()- це метод у проміса, який викликається, якщо проміс переходить у стан "відхилено" (rejected). Тобто він ловить усі помилки, що сталися:
- всередині проміса,
- всередині ланцюжка
.then(),- або при явному
reject().
2. Синтаксис
promise.catch(onRejected)де:
onRejected- функція, яка отримає об'єкт помилки.
3. Приклад: явне відхилення проміса
const promise = new Promise((resolve, reject) => {
reject("Помилка при завантаженні даних");
});
promise.catch(error => {
console.log("Спіймано:", error);
});Вивід:
Спіймано: Помилка при завантаженні даних.catch() спрацював, тому що проміс був відхилений (reject).
4. Приклад: помилка в коді автоматично викликає .catch()
const promise = new Promise(() => {
throw new Error("Щось пішло не так");
});
promise.catch(err => {
console.log("Спіймали помилку:", err.message);
});Вивід:
Спіймали помилку: Щось пішло не такБудь-яка помилка всередині функції-виконавця (
executor) автоматично викликаєreject.
5. Приклад: обробка помилок у ланцюжку .then()
Promise.resolve()
.then(() => {
throw new Error("Помилка в then");
})
.catch(error => {
console.log("Спіймали:", error.message);
});Вивід:
Спіймали: Помилка в then
.catch()перехоплює помилки, навіть якщо вони сталися в одному з попередніх.then().
6. .catch() = .then(null, onRejected)
Ці два варіанти повністю еквівалентні:
promise.catch(onRejected);
promise.then(null, onRejected);Обидва обробляють відхилений проміс.
Але .catch() читається простіше і використовується частіше.
7. Приклад: повернення значення з .catch()
Якщо в .catch() повернути значення, воно "відновлює" ланцюжок,
і наступний .then() отримає це значення як результат.
Promise.reject("Помилка")
.catch(err => {
console.log("Спіймали:", err);
return "Продовжуємо роботу";
})
.then(result => {
console.log("Результат:", result);
});Вивід:
Спіймали: Помилка
Результат: Продовжуємо роботу
.catch()може не тільки перехоплювати помилки, а й "зцілювати" ланцюжок.
8. Приклад: повторне викидання помилки
Якщо з .catch() знову викинути помилку (throw),
то вона передається далі - наступному .catch() у ланцюжку.
Promise.reject("Помилка 1")
.catch(err => {
console.log("Спіймали:", err);
throw new Error("Помилка 2");
})
.catch(err => {
console.log("Спіймали знову:", err.message);
});Вивід:
Спіймали: Помилка 1
Спіймали знову: Помилка 29. Приклад: .catch() в асинхронних функціях
.catch() працює так само, як try...catch, але у вигляді ланцюжка промісів.
async function getData() {
throw new Error("Помилка в async");
}
getData().catch(err => {
console.log("Спіймали:", err.message);
});Вивід:
Спіймали: Помилка в async10. Приклад з try...catch для порівняння
async function example() {
try {
await Promise.reject(new Error("Помилка в промісі"));
} catch (err) {
console.log("Спіймали через try...catch:", err.message);
}
}
example();Аналог .catch(), але в синтаксисі async/await.
Підсумок
| Особливість | Опис |
|---|---|
| Коли спрацьовує | Коли проміс відхилено (reject або throw) |
| Аналогічно | then(null, onRejected) |
| Повертає | Новий проміс |
| Може відновити ланцюжок | Якщо повернути значення з .catch() |
| Може передати помилку далі | Якщо знову throw всередині .catch() |
| Працює з async/await | Аналог try...catch |
Коротке порівняння:
| Ситуація | Що використовувати |
|---|---|
| Обробка помилки в ланцюжку промісів | .catch() |
Обробка помилок у async/await | try...catch |
| Потрібно продовжити ланцюжок після помилки | повернути значення з .catch() |
| Потрібно прокинути помилку далі | throw всередині .catch() |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.