Sobes.tech
Junior

Kako obraditi grešku (odbijanje) obećanja pri korišćenju await?

sobes.tech АИ

Одговор од АИ

Када користите await са обећавањем, грешке (reject) могу бити обрађене на више начина:

  1. Конструкција try...catch: Најчешћи и препоручени начин. Елегантно ухвати грешку која се баца при решавању (resolve) или одбијању (reject) обећавања.

    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        if (!response.ok) {
          throw new Error(`HTTP грешка! статус: ${response.status}`);
        }
        const data = await response.json();
        console.log(data);
      } catch (error) {
        console.error('Грешка при добијању података:', error);
        // Додатна обрада грешке или обавештење корисника
      }
    }
    
    fetchData();
    
  2. Метода .catch() после await: Мање препоручена, али могућа. Грешка ће бити обрађена у callback-у .catch(), ако је обећање одбијено.

    async function fetchData() {
      const response = await fetch('https://api.example.com/data')
        .catch(error => {
          console.error('Грешка при извршавању fetch:', error);
          // Обрада грешке fetch
          throw error; // Преносимо грешку за даљу обраду, ако је потребно
        });
    
      if (response && !response.ok) {
           console.error(`HTTP грешка! статус: ${response.status}`);
           // Обрада HTTP грешке
      }
    
      if (response && response.ok) {
          const data = await response.json()
              .catch(error => {
                  console.error('Грешка при парсирању JSON:', error);
                  // Обрада грешке парсирања JSON
              });
          if (data) {
              console.log(data);
          }
      }
    }
    
    fetchData();
    

    Овај приступ може постати сложен када постоји много потенцијалних тачака неуспеха.

  3. Обрада са враћањем вредности грешке: Неки библиотечки или сопствени позиви могу враћати пар [податке, грешка] уместо одбијања обећања.

    async function safelyFetchData() {
       const [data, error] = await safePromise(fetch('https://api.example.com/data'));
       if (error) {
          console.error('Генерална грешка при добијању података:', error);
          return null; // Или друга вредност која указује на неуспех
       }
       // Предпостављамо да safePromise такође обрађује response.ok
       console.log(data);
       return data;
    }
    
    // Пример имплементације safePromise (поједностављено)
    async function safePromise(promise) {
        try {
            const result = await promise;
             // Овде може бити провера result.ok за fetch
             if (result && result.ok !== undefined && !result.ok) {
                 throw new Error(`HTTP грешка! статус: ${result.status}`);
             }
            // За fetch, можда ће бити потребно да чекате и result.json()
            if (result && typeof result.json === 'function') {
                const jsonData = await result.json();
                return [jsonData, null];
            }
            return [result, null];
        } catch (error) {
            return [null, error];
        }
    }
    
    safelyFetchData();
    

    Овај образац (често називан "error-first callback" или "go-style error handling") је згодан када је потребно обрађивати грешке локално без прекидања извршења функције.

Најчистији и најчитљивији начин је коришћење try...catch око блока кода који садржи await.