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

Выполнение промисов партиями

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

При этом есть дополнительное требование, что нельзя, чтобы работало более limit функций одновременно. Для этого мы будем запускать функции партиями по limit штук за один раз.

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

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

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 --

Способы решения

Задачу можно решить двумя способами: через then и с помощью async/await.