前篇
关于compose
函数对于学过函数编程一定不陌生。在 redux 中也有应用。下面我们来实现一个 compose。场景:我们有三个函数,现在想要实现 1+2+3+4 结果。
const addOne = (num: number) => {
console.log('addOne input value', num);
return num + 1;
};
const addTwo = (num: number) => {
console.log('addTwo input value', num);
return num + 2;
};
const addThree = (num: number) => {
console.log('addThree input value', num);
return num + 3;
};
我们可以手动调用
addOne(addTwo(addThree(4)))
// 代码执行顺序如下:
/**
* addThree input value 4
* addTwo input value 7
* addOne input value 9
* 10
* /
下面我们通过compose
来组合上面函数的执行
function compose(...funcs) {
return (val) => funcs.reduceRight((acc, cur) => cur(acc), val);
}
//test
compose(addOne, addTwo, addThree)(4);
我们已经完成一个简易的compose
函数.下面我们有一个sum
函数想这样做
function sum(a: number, b: number) {
return a + b;
}
const sumValue = compose(addOne, addTwo, addThree, sum)(2, 2);
console.log(sumValue);
我们可以想到这样改造:
function compose(...funcs) {
return (...args) => funcs.reduceRight((acc, cur) => cur(acc), ...args);
}
由于 reduceRight 初始化只能介绍一个参数,这样并不能达到我们预期。因此我们可以将最后一个函数拿出来执行完后将值赋给reduceRight
function compose(...funcs) {
return (...args) => {
const lastFn = arr.pop();
const value = lastFn(...args);
return arr.reduceRight((acc, cur) => cur(acc), value);
};