为什么需要compose和pipe函数
函数式编程后执行的一些问题
- 值传递写起来不方便,连续执行一系列函数,并传递计算某个值,写起来难受
- 连续调用一系列函数,写起来很麻烦
function multipleTwo(num) {
return num * 2;
}
function minusOne(num) {
return num - 1;
}
function addTwo(num) {
return num + 2;
}
function addThree(num) {
return num + 3;
}
// 执行 *2-1+2+3
let res = multipleTwo(10);
res = minusOne(res);
res = addTwo(res);
res = addThree(res);
这种值传递很笨重
Compose函数
为了方便我们连续执行方法,把自己调用传值的过程封装起来,只需要给compose函数我们要执行哪些方法,它会自动执行并且传值
辅助我们去执行一系列方法的工具函数
var compose = function(f,g) {
return function(x) {
return f(g(x));
};
};
在 compose 的定义中,g 将先于 f 执行,因此就创建了一个从右到左的数据流。
function compose() {
// 不定参数,取arguments类数组对象,然后转为真正的数组
const args = [].slice.apply(arguments);
return function(num) {
/*let _res = num;
for (let i = args.length - 1; i >= 0; i --) {
_res = args[i](_res);
}
return _res;*/
// 使用高阶函数 reduceRight
return args.reduceRight((res, cb) => cb(res), 10);
}
}
// 执行 *2-1+2+3
let res = compose(addThree, addTwo, minusOne, multipleTwo)(10);
pipe函数
pipe函数和compose函数功能一样,只不过是从左往右执行
链式调用
也可以用promise来组织一个链式调用,与面向对象的链式调用有区别
Promise.resolve(10).then(multiplyTwo).then(minusOne).then(addTwo).then(addThree).then((res) => {
console.log(res);
})