Sobes.tech
Middle+

Γιατί στην υλοποίηση του promiseAll πρέπει να βασιζόμαστε στον μετρητή count αντί να ελέγχουμε απλώς το μήκος του πίνακα αποτελεσμάτων;

sobes.tech AI

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

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

Ο μετρητής count αυξάνεται μόνο όταν η υπόσχεση ολοκληρώνεται με επιτυχία, επιτρέποντας να παρακολουθείς ακριβώς πόσες υποσχέσεις έχουν ήδη ολοκληρωθεί. Αν ελέγχαμε μόνο το μήκος του πίνακα αποτελεσμάτων, θα μπορούσαμε λανθασμένα να πιστέψουμε ότι όλες οι υποσχέσεις έχουν ολοκληρωθεί, ακόμα και αν μερικές είναι ακόμα σε εξέλιξη ή έχει συμβεί σφάλμα.

Παράδειγμα:

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let count = 0;

    promises.forEach((p, i) => {
      Promise.resolve(p)
        .then(value => {
          results[i] = value;
          count++;
          if (count === promises.length) {
            resolve(results);
          }
        })
        .catch(err => reject(err));
    });
  });
}

Εδώ, το count διασφαλίζει ότι θα περιμένουμε την ολοκλήρωση όλων των υποσχέσεων, όχι μόνο την ύπαρξη στοιχείων στον πίνακα results.