JS进阶--compose和pipe函数

为什么需要

函数式编程后执行的一些问题

  • 值的传递写起来不方便
    如果要连续执行一系列函数,并且传递计算某个值,会写起来很难受
  • 连续调用写起来很麻烦
    连续调用一系列函数,写起来麻烦

compose函数

Compose函数可以理解成为了方便我们连续执行方法,把自己调用传值的过程封装了起来,我们只需要给Compose函数我们要执行哪些方法,函数就会自动执行

function minusOne(num){
	return num-1;
}
function addTwo(num){
	return num+2;
}
function multiplyTwo(num){
	return num*2;
}
/*
var res=multiplyTwo(10);
res=minusOne(res);
res=addTwo(res);
*/
/*compose函数方式调用*/
	/*理解*/
function compose(){
	const args=[].slice.apply(arguments);
	return function (num){
		var _res=num;
		for(var i = args.length-1; i>=0; i--){
			_res=args[i](_res)
		}
		return _res;
	}
}
compose(addTwo,minusOne,multiplyTwo)(10) /*括号中的函数执行顺序为从右至左*/
	/*开发写法*/
function compose(){
	const args=[].slice.apply(arguments);
	return function (num){
		return args.reduceRight((res,cd)=>cd(res),num);
	}
}
compose(addTwo,minusOne,multiplyTwo)(10) /*括号中的函数执行顺序为从右至左*/
/* @param  {Array[Function]} funcs
@param是注解传参
 */
export default function Compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg;
  }
  return funcs.reduce((a, b) => (...args) => a(b(...args)));
}

pipe函数

  • 与compose函数功能一样,只是执行顺序为从左往右

链式调用

  • 使用promise来组织成一个链式调用,但是要注意,这和面向对象的链式调用有所不同
Promise.resolve(10).then(multiplyTwo).then(minusOne).then(addTwo).then((res)=>{
	console.log(res);
})

你可能感兴趣的:(js进阶-学习,javascript,开发语言,ecmascript)