compose和pipe函数

294 阅读1分钟

为什么需要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);
})