Middle
/* * Fonction qui émule la demande de données depuis le backend. * Le backend a une limitation RPS, et échouera, * si le nombre de requêtes parallèles dépasse MAX_PARALLEL_REQUESTS. */ function requestData(id: number): Promise<string> { parallelRequests++; if (parallelRequests > MAX_PARALLEL_REQUESTS) { throw new Error("Trop de requêtes parallèles"); } return new Promise((res) => { setTimeout(() => { parallelRequests--; return res(`${id * 2}`); }, Math.floor(Math.random() * 2000)) }); } function prepareData( ids: number[], maxParallelRequests: number, ): Promise<string[]> { /* * TODO: implémenter la demande de toutes les données, * en utilisant pas plus de maxParallelRequests * connexions parallèles. */ }
sobes.tech IA
Réponse de l'IA
Pour implémenter la fonction prepareData, qui demande des données avec une limite sur le nombre de requêtes parallèles, on peut utiliser une file d'attente et contrôler le nombre d'appels simultanés à requestData.
Exemple d'implémentation utilisant async/await et une boucle :
async function prepareData(ids: number[], maxParallelRequests: number): Promise<string[]> {
const results: string[] = [];
let index = 0;
// Fonction pour lancer une requête et sauvegarder le résultat
async function worker() {
while (index < ids.length) {
const currentIndex = index++;
try {
results[currentIndex] = await requestData(ids[currentIndex]);
} catch (e) {
results[currentIndex] = `Error: ${(e as Error).message}`;
}
}
}
// Lancer maxParallelRequests workers
const workers = [];
for (let i = 0; i < maxParallelRequests; i++) {
workers.push(worker());
}
await Promise.all(workers);
return results;
}
L'idée est de lancer plusieurs "workers", chacun traitant de manière séquentielle les éléments du tableau ids jusqu'à ce qu'ils soient tous traités. Ainsi, pas plus de maxParallelRequests requêtes seront en cours d'exécution simultanément, respectant la limite du backend.