Эта задача похожа на 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 --