Назад к задачам
Junior — Senior
3

Контроллер количества одновременно исполняемых асинхронных задач

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

МТСМТС
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Реализуйте функцию runWithConcurrencyLimit(tasks, limit), которая принимает массив функций‑запросов tasks и целое число limit, задающее максимальное количество задач, исполняющихся одновременно.

Каждая функция из массива tasks должна возвращать Promise. Функция runWithConcurrencyLimit обязана запускать задачи, соблюдая указанный порог limit на количество одновременно работающих промисов. В результате она должна вернуть Promise, который разрешается массивом результатов в том же порядке, что и исходный массив tasks. Если какая‑то задача завершится с ошибкой, её ошибка должна быть сохранена в результирующем массиве под тем же индексом, при этом выполнение остальных задач не должно прерываться.

/*
Пример использования:  
const tasks = [  
  () => new Promise(resolve => setTimeout(() => resolve(1), 2000)),  
  () => new Promise(resolve => setTimeout(() => resolve(2), 2000)),  
  () => new Promise((_, reject) => setTimeout(() => reject('Error in task 3'), 1000)),  
  () => new Promise(resolve => setTimeout(() => resolve(4), 4000)),  
]  
*/

runWithConcurrencyLimit(tasks, 2)  
.then(results => console.log(results))  
.catch(err => console.error(err));  

// Ожидаемый вывод после примерно 7 секунд:  
// [1, 2, 'Error in task 3', 4]  

// limit always positive (>= 1)  
function runWithConcurrencyLimit(tasks, limit) {}