Здравствуйте,
При создании сложной функциональности чаще всего возникает ситуация, когда нужно передать значение в функцию, а возвращаемое значение (результат) является необходимым входом для другой функции. Это может показаться нормальным, если у вас 2 — 3 функции, но когда у вас больше, чем нужно, ваш код становится беспорядочным и нечитабельным. Чтобы решить эту проблему, на помощь приходит композиция функций.
Это механизм объединения функций, при котором выход каждой функции передается в следующую, а выход последней функции является конечным результатом. Применим к любому языку программирования, не только к JavaScript.
Мы можем сделать это двумя разными способами. Однако следует помнить, что последовательность имеет значение, и это изменит ваш конечный результат.
Композиция
Передача функций в порядке справа налево для выполнения. Пример (f4,f3,f2,f1 )
//Compose function using reduceRight()
const compose = (...args) => (value) => args.reduceRight((prev, fn) => fn(prev), value);
// Increment the passed value by 2
const increment = (n) => n + 2;
// Triples the passed value
const double = (n) => n * 3;
//Divide it by 2
const divide = (n) => n / 2;
// Using our composition function
console.log(compose(divide, double, increment)(2)); // 6
Pipe
Передача функций для выполнения в порядке слева направо. Пример (f1,f2,f3,f4 )
//pipe function using reduce(), default left to right execution
const pipe = (...args) => (value) => args.reduce((prev, fn) => fn(prev), value);
// Increment the passed value by 2
const increment = (n) => n + 2;
// Triples the passed value
const double = (n) => n * 3;
//Divide it by 2
const divide = (n) => n / 2;
// Using our pipe function
console.log(pipe(increment, double, divide)(3)); // 7.5
Совет: Как уже упоминалось, последовательность имеет значение, поэтому вы можете создать только составную функцию и использовать ее в качестве трубы, передавая функции в порядке слева направо.
Спасибо за прочтение.