Асинхронный JavaScriptЗапуск асинхронных функцийhard

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

Эта задача похожа на promise-batch, но решение должно работать быстрее.

Необходимо реализовать функцию run, которая принимает массив асинхронных функций fns и возвращает промис с массивом результатов этих функций. При этом есть дополнительное требование, что нельзя, чтобы работало более limit функций одновременно.

Можно считать, что limit точно положительное целое число, а функции из fns возвращают промисы, которые никогда не реджектятся.

Если запускать по limit функций за раз и ждать, когда они все отработают, перед запуском следующей партии, то возникают простои и функция run работает дольше.

В этой задаче предлагается реализовать «асинхронную очередь»: как только завершает работу одна из функций, ее место занимает следующая.

Пример вызова

const fn1 = () => new Promise(r => setTimeout(r, 3400, "a")); const fn2 = () => new Promise(r => setTimeout(r, 600, "b")); const fn3 = () => new Promise(r => setTimeout(r, 2000, "c")); const fn4 = () => new Promise(r => setTimeout(r, 1400, "d")); const fn5 = () => new Promise(r => setTimeout(r, 1800, "e")); const fn6 = () => new Promise(r => setTimeout(r, 400, "f")); run([fn1, fn2, fn3, fn4, fn5, fn6], 2).then(arr => { console.log(arr); // arr === ["a", "b", "c", "d", "e", "f"] });

Если limit равен 2, то получается такая диаграмма:

fn1 ----------------- fn2 --- fn3 ---------- fn4 ------- fn5 -------- fn6 --

Если limit равен 4, то получается такая диаграмма:

fn1 ----------------- fn2 --- fn3 ---------- fn4 ------- fn5 -------- fn6 --