数组reduc实现函数聚合,类似中间件处理数据

248 阅读1分钟

今天在学习过程发现函数聚合的写法
就是按照指定顺序执行一组函数
以前也遇到过 但是没有深入研究怎么实现的
今天学习的时候又绕不过去 就研究了一下 这里记录一下


其实很简单
一个方法就能搞定
就是数组的reduc方法

下面来简单实现一下

	// 这里是三个操作函数
    function f1(arg){
      arg += 'arg=>1 '
      console.log('f1处理了arg:'+arg)
      return arg
    }
    function f2(arg){
      arg += 'arg=>2 '
      console.log('f2处理了arg:'+arg)
      return arg
    }
    function f3(arg){
      arg += 'arg=>3 '
      console.log('f3处理了arg:'+arg)
      return arg
    }
    // 这是聚合函数 将几个不同的函数聚合起来按顺序执行
    function compose(...funs){
      // 数据兜底
      if(funs.length === 0) return arg => arg
      if(funs.length === 1) return funs[0]
      // 实现聚合 这里为了方便看 没有全写成箭头函数
      return funs.reduce((prev,curr)=>{
      	// 返回一个函数 函数执行体是用下一个函数包裹上一个函数的返回值
        return (...args)=>curr(prev(...args))
      })
    }
    console.log(compose(f1,f2,f3)(''))
    //输出
    f1处理了arg:arg=>1 
    f2处理了arg:arg=>1 arg=>2 
    f3处理了arg:arg=>1 arg=>2 arg=>3 
    arg=>1 arg=>2 arg=>3


compose(f1,f2,f3)('') 其实就是f3( f2( f1('') ) ) 通过处理 把结果返回给下一个处理函数
不过就是现在这个处理顺序可以随意改变 如compose(f2,f1,f3)('')

reduxapplyMiddleware方法应该就是类似这种的实现方式在dispatch的时候执行一些附加的方法