Функция composeAsyncFunctions
выполняет композицию для асинхронных функций слева направо.
Мы используем Array.prototype.reduce()
с оператором распространения ...
, чтобы выполнить композицию функций слева направо с помощью Promise.then()
. Функции могут возвращать комбинацию из: простых значений, значений Promise
или их можно определить как асинхронные async
, возвращаемые через await
. Все функции должны быть одинарными (унарными).
const composeAsyncFunctions = (...fns) => arg =>
fns.reduce((p, fn) => p.then(fn), Promise.resolve(arg));
// Пример:
const sum = composeAsyncFunctions(
x => x + 1,
x => new Promise(resolve => setTimeout(() => resolve(x + 2), 1000)),
x => x + 3,
async x => (await x) + 4
);
(async () => {
console.log(await sum(2)); // 12 (Через одну секунду)
})();