Асинхронность. ПродолжениеИспользование промисовmedium

Асинхронная очередь с лимитом

Реализуйте класс AsyncQueue с двумя методами:

  • constructor(concurrencyLimit) — принимает максимальное количество асинхронных функций, которые могу быть запущены одновременно;
  • enqueue(task) — принимает асинхронную функцию без аргументов.

Если в очереди есть место, то добавленная с помощью метода enqueue задача должна запуститься сразу. Если нет, то она добавляется в очередь и выполняется, когда место осовободится. Функции запускаются в порядке добавления в очередь.

Пример

const aq = new AsyncQueue(3); aq.enqueue(() => new Promise(r => setTimeout(r, 1000))); // запустится сразу aq.enqueue(() => new Promise(r => setTimeout(r, 500))); // запустится сразу aq.enqueue(() => new Promise(r => setTimeout(r, 700))); // запустится сразу aq.enqueue(() => new Promise(r => setTimeout(r, 300))); // запустится через 500 мс aq.enqueue(() => new Promise(r => setTimeout(r, 1000))); // запустится через 700 мс setTimeout(() => { aq.enqueue(() => new Promise(r => setTimeout(r, 900))); // запустится сразу }, 1500);

Схематично работа функций будет выглядеть так:

1--------- 6-------- 2----4-- 3------5---------

Число означает, какой по счету функция была добавлена в асинхронную очередь.