Sobes.tech
Назад к вопросам
Middle
2

/* * Function that emulates requesting data from backend. * Backend has RPS limitation, and will fail, * if parallel requests number is more than MAX_PARALLEL_REQUESTS. */ function requestData(id: number): Promise<string> { parallelRequests++; if (parallelRequests > MAX_PARALLEL_REQUESTS) { throw new Error("Too many parallel requests"); } return new Promise((res) => { setTimeout(() => { parallelRequests--; return res(`${id * 2}`); }, Math.floor(Math.random() * 2000)) }); } function prepareData( ids: number[], maxParallelRequests: number, ): Promise<string[]> { /* * TODO: implement requesting all data, * using no more than maxParallelRequests * parallel connections. */ }

Компании, где спрашивали
Trading view

Ответ от нейросети

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

Идея в том, что мы запускаем несколько "воркеров", каждый из которых последовательно обрабатывает элементы массива ids, пока не закончатся. Таким образом, одновременно будет выполняться не более maxParallelRequests запросов, что соответствует ограничению backend.