Sobes.tech
Junior

Πώς μπορείτε να χειριστείτε ένα σφάλμα (reject) μιας υπόσχεσης κατά τη χρήση του await;

sobes.tech AI

Απάντηση από AI

Όταν χρησιμοποιείτε το 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 error! status: ${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 error! status: ${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 error! status: ${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.