Sobes.tech
Back to tasks
Junior — Senior
23

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

Companies where asked:

МТСМТС
Get help with live coding in real time with Sobes Copilot
Task condition

Реализуйте функцию 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) {}