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 συναρτήσεις παρέχει ένα πιο οικείο, συγχρονισμένο στυλ επεξεργασίας σφαλμάτων.