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;
}