Middle+
Zadanie praktyczne: zaimplementuj funkcję, która przyjmuje tablicę URL-i i limit równoczesnych zapytań, i wykonuje zapytania fetch z ograniczeniem równoległego wykonywania (nie więcej niż limit zapytań jednocześnie), zwracając wyniki w kolejności początkowej.
sobes.tech AI
Odpowiedź od AI
Aby rozwiązać problem z ograniczeniem liczby jednoczesnych zapytań fetch, można użyć kolejki i kontrolować liczbę aktywnych obietnic. Poniżej znajduje się przykład implementacji w JavaScript z użyciem 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()) // lub res.json() w zależności od zadania
.then(data => {
results[index] = data;
})
.catch(err => {
results[index] = err;
})
.finally(() => {
activeCount--;
next();
});
}
}
next();
});
}
W tym kodzie nie uruchamiamy więcej niż limit zapytań jednocześnie, a po każdym zakończeniu uruchamiamy kolejny z kolejki. Wyniki są przechowywane w tablicy results w oryginalnej kolejności.