Реализуйте класс AsyncQueue
с двумя методами:
Если в очереди есть место, то добавленная с помощью метода 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---------
Число означает, какой по счету функция была добавлена в асинхронную очередь.