Очередь задач с лимитом

Hard
PromiseAsyncQueueAvito

Реализуйте функцию limitConcurrency(tasks, limit), которая:

  • Принимает массив функций, каждая из которых возвращает промис
  • Выполняет не более limit задач одновременно
  • Возвращает промис с массивом результатов в порядке входного массива
const tasks = [
  () => fetch('/api/1'),
  () => fetch('/api/2'),
  () => fetch('/api/3'),
  () => fetch('/api/4'),
];
const results = await limitConcurrency(tasks, 2);
// максимум 2 запроса одновременно
Подсказка

Заведите счётчик running и указатель index. Функция next() стартует новые задачи пока running < limit && index < tasks.length. Важно: захватывайте i = index++ до инкремента, чтобы записать результат в results[i] — так сохраняется порядок.

Подсказка

Что ещё могут спросить: а если одна из задач упала с ошибкой — что делать с остальными? (reject сразу или дождаться всех). Или реализовать limitConcurrency через Promise.allSettled.

Ваш код - JavaScript
Результаты
Нажмите «Запуск» для выполнения кода