Композиция промисов
Функция может вернуть промис, назовем такую функцию – фабрикой промисов. Как и обычные синхронные функции, фабрики промисов можно композировать, хотя реализация будет отличаться.
Композировать будем через compose. Принцип compose, похож на pipe, с той разницей, что композиция выполняется справа налево, а в случае с pipe она выполнялась бы слева направо.
const composePromises = (...promiseFabrics) => (
promiseFabrics.reduce((f, g) => value => g(value).then(f))
);
const minusOne = n => Promise.resolve(n - 1);
const addTwo = n => Promise.resolve(n + 2);
const multipleTwo = n => Promise.resolve(n * 2);
const calculate = composePromises(minusOne, addTwo, multipleTwo);
calculate(2).then(console.log); // 5
Интересно, что в отличие от синхронного варианта композиции, composePromises не возвращает функцию, которая возвращает результат редьюсера. Вместо этого, сразу возвращается результат работы редьюсера. Магия в том, что этот редьюсер возвращает функцию, а не переменную.