Sobes.tech
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;
}