Sobes.tech
Middle+

Sarcină practică: implementează o funcție care acceptă un array de URL-uri și o limită pentru cererile simultane, și efectuează cereri fetch cu restricția de execuție paralelă (nu mai mult de limit cereri în același timp), returnând rezultatele în ordinea inițială.

sobes.tech AI

Răspuns de la AI

Pentru a rezolva problema cu restricția asupra numărului de solicitări fetch simultane, poți folosi o coadă și controla numărul de promisiuni active. Iată un exemplu de implementare în JavaScript folosind 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()) // sau res.json() în funcție de sarcină
          .then(data => {
            results[index] = data;
          })
          .catch(err => {
            results[index] = err;
          })
          .finally(() => {
            activeCount--;
            next();
          });
      }
    }

    next();
  });
}

În acest cod, nu lansăm mai mult de limit solicitări simultan, iar după finalizarea fiecăreia, se lansează următoarea din coadă. Rezultatele sunt stocate în array-ul results în ordinea inițială.