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

Асинхронный compose

Функция compose принимает массив асинхронных функций и возвращает асинхронную функцию. Эта функция принимает один аргумент и последовательно справа налево выполняет асинхронные функции.

Пример

  • square возводит в квадрат за 2000 мс
  • divideBy5 делит на 5 за 1500 мс
  • multiplyBy3 умножает на 3 за 500 мс
const foo = compose([square, divideBy5, multiplyBy3]); foo(10).then(x => { console.log(x); // 36 });

Функция foo (результат вызова compose):

  • принимает число 10,
  • умножает 10 на 3, получается 30,
  • делит 30 на 5, получается 6
  • возводит 6 в квадрат, получается 36
  • возвращает 36 (точнее возвращает промис, который резолвится числом 36)

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

Эту задачу можно решить как минимум 3 способами:

  • циклом for
  • используя рекурсию
  • с помощью синтаксиса async/await

Код для тестирования

const square = x => new Promise(r => setTimeout(r, 2000, x ** 2)); const divideBy5 = x => new Promise(r => setTimeout(r, 1500, x / 5)); const multiplyBy3 = x => new Promise(r => setTimeout(r, 500, x * 3)); const foo = compose([square, divideBy5, multiplyBy3]); console.time("xxx"); foo(10).then(value => { console.log(value); console.timeEnd("xxx"); });