⊗jsSpPrmChE 169 of 294 menu

Εξαιρέσεις στις αλυσίδες των Promise στην JavaScript

Ας υποθέσουμε ότι για κάποιο λόγο το promise μας ολοκληρώνεται με σφάλμα:

let promise = new Promise(function(resolve, reject) { setTimeout(function() { reject('error'); }, 3000); });

Σε αυτήν την περίπτωση, η εκτέλεση του κώδικα θα προχωρήσει αμέσως στο then που έχει τον χειριστή σφάλματος, ή στο πρώτο catch, ανάλογα με το ποιο συναντάται πρώτο.

Ακολουθεί ένα παράδειγμα της πρώτης κατάστασης:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; }, function(error) { // η εκτέλεση θα προχωρήσει αμέσως εδώ } ).then( function(result) { console.log(result); } );

Ακολουθεί ένα παράδειγμα της δεύτερης κατάστασης:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; } ).catch( function(error) { // η εκτέλεση θα προχωρήσει αμέσως εδώ } ).then( function(result) { console.log(result); } );

Ο χειριστής έχει δύο επιλογές δράσης: αν αντιμετώπισε την εξαιρετική κατάσταση, μπορεί να επιστρέψει το αποτέλεσμα μέσω return και η εκτέλεση θα συνεχιστεί περαιτέρω στην αλυσίδα. Εάν δεν αντιμετώπισε το σφάλμα, μπορεί είτε να μην επιστρέψει τίποτα, είτε να πετάξει μια εξαίρεση μέσω throw. Σε αυτήν την περίπτωση, η εκτέλεση θα προχωρήσει στον επόμενο χειριστή σφαλμάτων (στο then ή catch - όποιο συναντηθεί πρώτο).

Κατά κανόνα, όλα τα σφάλματα της αλυσίδας υποβάλλονται σε ένα σημείο: στο τέλος της αλυσίδας τοποθετείται ένα catch:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; } ).catch( function(error) { // θα φτάσουμε εδώ σε περίπτωση σφάλματος } );

Σε αυτήν την περίπτωση, η εξαίρεση μπορεί να προκύψει στο ίδιο το promise, ή να πεταχτεί μέσω throw σε οποιοδήποτε σύνδεσμο της αλυσίδας:

promise.then( function(result) { return result + '1'; } ).then( function(result) { if (όλαΚαλά) { return result + '2'; } else { throw new Error('σφάλμα'); // πηγαίνουμε στον πλησιέστερο χειριστή } } ) .then( function(result) { return result + '3'; } ).catch( function(error) { // ο πλησιέστερος χειριστής } );

Λάβετε υπόψη ότι το catch χρειάζεται ακριβώς για διάγνωση του σφάλματος: είναι επιλύσιμο ή όχι. Εάν το σφάλμα είναι επιλύσιμο, τότε το catch πρέπει να μεταφέρει τη λύση του στο επόμενο then μετά από αυτό. Και εάν δεν είναι επιλύσιμο (ή αυτό το catch απλά δεν ξέρει πώς να το λύσει), τότε πρέπει είτε να μην επιστρέψουμε τίποτα είτε να πετάξουμε μια εξαίρεση:

promise.then( function(result) { return result + '1'; } ).then( function(result) { return result + '2'; } ).catch( function(error) { if (τοΣφάλμαΕίναιΕπιλύσιμο) { return 'δεδομένα'; // στέλνουμε στο επόμενο then } else { // δεν επιστρέφουμε τίποτα ή πετάμε εξαίρεση } } ).then( function(result) { // εδώ λύνουμε το σφάλμα } );
Ελληνικά
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Χρησιμοποιούμε cookie για τη λειτουργία του ιστότοπου, την ανάλυση και την εξατομίκευση. Η επεξεργασία των δεδομένων γίνεται σύμφωνα με την Πολιτική Απορρήτου.
αποδοχή όλων ρύθμιση απόρριψη