Назад к задачам
МТСПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
3
Контроллер количества одновременно исполняемых асинхронных задач
Компании, где спрашивали:
Условие задачи
Реализуйте функцию 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) {}