Πώς μπορείτε να χειριστείτε ένα σφάλμα (reject) μιας υπόσχεσης κατά τη χρήση του await;
sobes.tech AI
Απάντηση από AI
Όταν χρησιμοποιείτε το await με μια υπόσχεση, τα σφάλματα (reject) μπορούν να διαχειριστούν με διάφορους τρόπους:
-
Δομή
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(); -
Μέθοδος
.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();Αυτή η προσέγγιση μπορεί να γίνει δυσκίνητη όταν υπάρχουν πολλά πιθανά σημεία αποτυχίας.
-
Επεξεργασία με επιστροφή σφάλματος και τιμή: Μερικές βιβλιοθήκες ή δικές σας συναρτήσεις μπορεί να επιστρέφουν το ζεύγος
[δεδομένα, σφάλμα]αντί για απόρριψη της υπόσχεσης.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.