compose 和 pipe 函数

lxf2023-05-03 00:54:47

一、为什么需要 compose 和 pipe 函数

我们使用函数式编程后带来的一些问题:

1、值的传递写起来不方便

我们如果需要连续的一系列函数,并且传递计算某个值,写起来会很难受。

2、连续调用写起来很麻烦

function multiplyTwo(num) {
    return num * 2;
}

function minusOne(num) {
    return num - 1;
}

function addTwo(num) {
    return num + 2;
}

function addThree(num) {
    return num + 3;
}

var result = multiplyTwo(1);
result = minusOne(result);
result = addTwo(result);
result = addThree(result)
console.log(result) //6

compose 和 pipe 函数就是为了解决以上问题。


二、什么是 compose 和 pipe 函数

compose 函数

  • 概念:将需要嵌套执行的函数扁平化处理。嵌套执行指的是,一个函数的返回值将作为另一个函数的参数
  • 作用:实现函数式编程中的 pointfree 风格(无参数),使我们专注于【转换】而不是【数据】
  • 实现:接收多个函数作为参数,从右到左,一个函数的输入为另一个函数的输出
  • 意义:编程更精练、算法更清晰、无参数干扰
  • 威力:【可任意组合】
  • 缺点:不能直观的看到参数

compose 函数可以理解为为了方便我们连续执行方法,把自己调用传值的过程封装了起来,我们只需要告诉 compose 函数我们要执行哪些方法,他会自动的传值执行。也就是辅助我们执行一系列函数的工具函数。

// 可直接使用、不用在意参数的 compose 函数
function compose() {
    const args = [].slice.apply(arguments); //将arguments转化为数组
    return function (num) {
        // var _result = num;
        // for (var i = args.length - 1; i >= 0; i--) {
        //     _result = args[i](_result);
        // }
        // return _result;

        return args.reduceRight((res,cd) => cd(res),num); //reduceRight()从数组的末尾向前将数组中的数组项做嵌套,效果同上
    }
}

var result = compose(addThree, addTwo, minusOne, multiplyTwo)(1); //执行顺序右往左
console.log(result1) //6

pipe 函数

pipe 函数和 compose 函数的功能和写法几乎一样,只不过 pipe 是从左往右执行,而 copmose 是从右往左执行。

function pipe() {
    const args = [].slice.apply(arguments);
    return function (num) {
        return args.reduce((res,cd) => cd(res),num);
    }
}

var result = pipe(addThree, addTwo, minusOne, multiplyTwo)(1); //执行顺序左往右
console.log(result) //10

三、拓展

链式调用

我们也可以用 promise 来组织成一个链式调用,链式调用一样可以解决一系列函数传值计算难的问题。但是需要注意,方法的链式和面向对象的链式调用有区别。

Promise.resolve(1).then(multiplyTwo).then(minusOne).then(addTwo).then(addThree).then(res => {
    console.log(res) //6
})
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!