Sobes.tech
Junior

Как се справяш със ситуацията, когато обещанието завърши с грешка (отказ)?

sobes.tech AI

Отговор от AI

Обработвам с помощта на методите .catch() или .finally().

.catch() се използва за обработка на отхвърлени promises. Ако promise бъде успешно изпълнено, блокът .catch() се игнорира.

// Обработка на грешка с `.catch()`
fetch('/api/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Request failed'); // Имитация на грешка
    }
    return response.json();
  })
  .then(data => {
    console.log('Получени данни:', data);
  })
  .catch(error => {
    console.error('Грешка:', error); // Обработка на грешката тук
  });

.finally() се изпълнява независимо дали promise е успешно (fulfill) или с грешка (reject). Полезен е за почистване на ресурси или скриване на индикатори за зареждане.

// Използване на `.finally()` за изпълнение на код след приключване на promise
fetch('/api/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Request failed');
    }
    return response.json();
  })
  .then(data => {
    console.log('Получени данни:', data);
  })
  .catch(error => {
    console.error('Грешка:', error);
  })
  .finally(() => {
    console.log('Заявката е приключила.'); // Този код винаги ще се изпълни
  });

Мога също да използвам конструкцията try...catch вътре във async функции за обработка на грешки при асинхронни операции, включително promises:

// Обработка на грешки в async/await с помощта на try...catch
async function fetchData() {
  try {
    const response = await fetch('/api/data');
    if (!response.ok) {
      throw new Error('Request failed');
    }
    const data = await response.json();
    console.log('Получени данни:', data);
  } catch (error) {
    console.error('Грешка:', error); // Обработка на грешката тук
  } finally {
    console.log('Завършване на операцията fetch.'); // Винаги се изпълнява
  }
}

fetchData();

Изборът на метод зависи от контекста и необходимата логика за обработка. .catch() е основната конструкция за реакция на грешки, а .finally() за действия, които се изпълняват независимо от резултата. try...catch в async функции осигурява по-обичайния, синхронен стил на обработка на грешки.