Назад к вопросам
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.