Λήψη σφαλμάτων στο Promise.all

Μια ασφαλής εναλλακτική λύση στο Promise.all της Javascript

Αναμονή όλων των υποσχέσεων, συμπεριλαμβανομένων των σφαλμάτων

Εάν είστε προγραμματιστής Javascript, πιθανότατα έχετε χρησιμοποιήσει το τυπικό ενσωματωμένο αντικείμενο Promise και το API του Promise.all, το οποίο περιμένει μέχρι να επιλυθούν όλες οι υποσχέσεις που παρέχονται σε έναν πίνακα. Αυτός είναι ένας πολύ κομψός τρόπος για να περιμένετε διάφορα ασύγχρονα αποτελέσματα πριν προχωρήσετε στην επιχειρηματική σας λογική.

Αλλά αυτό το API δεν χειρίζεται σφάλματα. Κάθε φορά που παρουσιάζεται τουλάχιστον ένα σφάλμα στη σειρά υποσχέσεων, η λειτουργία σταματά αμέσως και δεν αναμένονται περαιτέρω αποτελέσματα.

Το Promise.allSettled αναμένει όλα τα αποτελέσματα ασυγχρονισμού

Ευτυχώς, υπάρχει διαθέσιμο ένα δεύτερο API που ονομάζεται Promise.allSettled που εγγυάται ότι θα περιμένει όλες τις υποσχέσεις, ανεξάρτητα από το αν το αποτέλεσμα είναι έγκυρο ή ένα σφάλμα. Ο παρακάτω κώδικας δείχνει τη χρήση του, η οποία είναι πραγματικά απλή, αλλά μπορεί να σας γλιτώσει από πολύ πονοκέφαλο.

Η κύρια διαφορά με το Promise.all είναι ότι κάθε υπόσχεση επιλύεται σε μια πλειάδα πληροφοριών, όπου είναι διαθέσιμα τόσο η κατάσταση (εκπληρώθηκε ή απορρίφθηκε) όσο και η αξία (σε περίπτωση εκπλήρωσης) ή ο λόγος (σε περίπτωση απόρριψης) .

Παροχή κενού πίνακα

Μια ειδική περίπτωση που πρέπει να γνωρίζετε είναι ότι όταν το Promise.allSettled λαμβάνει έναν κενό πίνακα ως είσοδο, μετατρέπεται αμέσως σε έναν κενό πίνακα. Αυτό ακούγεται λογικό και είναι η αναμενόμενη συμπεριφορά, αλλά παρόλα αυτά ήθελα να το επισημάνω.

/**
 * A simple dummy function that
 * fetches data from multiple
 * endpoints related to a user.
 */
async function fetchUserData(id){
  // A simple array of promises.
  // The first two parameters are
  // mock calls from down below.
  const promises = [
    fetchUserHistory(id),
    fetchUserProfile(id),
    // For testing only, let's throw.
    Promise.reject(new Error('an error'))
];
  
  const values = await Promise.allSettled(promises);
  // values === [
  //    { status: "fulfilled", value: [1, 2, 3] },
  //    { status: "fulfilled", value: {name:"dummy"} },
  //    { status: "rejected", reason: {}
  // ]
}

// The following functions are just mocks
// and should help improve readability
// of the example at the top.

async function fetchUserHistory(id){
  return Promise.resolve([1,2,3]);
}

async function fetchUserProfile(id){
  return Promise.resolve({ name: "dummy" });
}

Όπως μπορείτε να δείτε, το Promise.allSettled είναι μια πολύ ωραία προσθήκη στο Promise.all και σας επιτρέπει να περιμένετε όλα τα αποτελέσματα, ανεξάρτητα από τα αποτελέσματά τους. Δεν νομίζω ότι αυτό το API θα ταιριάζει σε κάθε περίπτωση χρήσης, αλλά σίγουρα σας εξοικονομεί από την αναδίπλωση ασύγχρονων κλήσεων σε ένα γενικό μπλοκ try-catch-block.

Προτάσεις

Σχετικά

Προσάρτημα

Γλώσσες