Middle
/* * Ֆունկցիա, որը իմիտացիա է բեկենդից տվյալների խնդրանքը: * Բեկենդը ունի RPS սահմանափակում և կթողնի սխալ, * եթե միաժամանակյա հարցումների թիվը գերազանցի MAX_PARALLEL_REQUESTS-ը: */ function requestData(id: number): Promise<string> { parallelRequests++; if (parallelRequests > MAX_PARALLEL_REQUESTS) { throw new Error("Անթույլատրելի շատ միաժամանակյա հարցումներ"); } return new Promise((res) => { setTimeout(() => { parallelRequests--; return res(`${id * 2}`); }, Math.floor(Math.random() * 2000)) }); } function prepareData( ids: number[], maxParallelRequests: number, ): Promise<string[]> { /* * TODO: իրականացնել բոլոր տվյալների խնդրանքը, * օգտագործելով ոչ ավել քան maxParallelRequests * միաժամանակյա կապեր: */ }
sobes.tech AI
Պատասխան AI-ից
prepareData ֆունկցիան իրականացնելիս, որը հարցում է տվյալներ սահմանափակելով հոսքերի քանակը, կարող եք օգտագործել հերթ և վերահսկել requestData-ի միաժամանակյա կանչերի քանակը:
Օրինակ՝ օգտագործելով async/await և ցիկլ:
async function prepareData(ids: number[], maxParallelRequests: number): Promise<string[]> {
const results: string[] = [];
let index = 0;
// Ֆունկցիա՝ մեկ հարցում սկսելու և արդյունքը պահելու համար
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}`;
}
}
}
// Սկսում ենք maxParallelRequests աշխատողներ
const workers = [];
for (let i = 0; i < maxParallelRequests; i++) {
workers.push(worker());
}
await Promise.all(workers);
return results;
}