Sobes.tech
Middle+

Πρακτική εργασία: υλοποιήστε μια λειτουργία που δέχεται έναν πίνακα URL και ένα όριο ταυτόχρονων αιτημάτων, και εκτελεί fetch αιτήματα με περιορισμό της παράλληλης εκτέλεσης (όχι περισσότερα από το όριο αιτήματα ταυτόχρονα), επιστρέφοντας τα αποτελέσματα με την αρχική σειρά.

sobes.tech AI

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

Για την επίλυση του προβλήματος με τον περιορισμό του αριθμού των ταυτόχρονων fetch αιτημάτων, μπορείτε να χρησιμοποιήσετε μια ουρά και να ελέγξετε τον αριθμό των ενεργών υποσχέσεων. Ακολουθεί ένα παράδειγμα υλοποίησης σε JavaScript με χρήση async/await:

async function limitedFetch(urls, limit) {
  const results = new Array(urls.length);
  let activeCount = 0;
  let currentIndex = 0;

  return new Promise((resolve, reject) => {
    function next() {
      if (currentIndex === urls.length && activeCount === 0) {
        resolve(results);
        return;
      }

      while (activeCount < limit && currentIndex < urls.length) {
        const index = currentIndex++;
        activeCount++;
        fetch(urls[index])
          .then(res => res.text()) // ή res.json() ανάλογα με την εργασία
          .then(data => {
            results[index] = data;
          })
          .catch(err => {
            results[index] = err;
          })
          .finally(() => {
            activeCount--;
            next();
          });
      }
    }

    next();
  });
}

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