要素:

1、高阶函数:reduce;

2、处理函数:reducer;

3、数据:可以是具体数据、签名相同的普通函数、签名相同的高阶函数;

reduce(reducer, datas(data or funciton), initResult(optional))

一、平凡数据处理

1 In [5]: reduce(add, [1,2,3,4,5])

2 Out[5]: 15

1 In [6]: reduce(add, [1,2,3,4,5], 10)

2 Out[6]: 25

二、函数组作为数据、计算串联、函数输入与返回单一类型兼容;缩减结果为普通数值;

reducer:(result, fn) => fn(result)

function compose(...funcs) {

return result => [...funcs]

.reverse()

.reduce((result, fn) => fn(result), result);

}

三、函数组作为数据、计算串联组合,缩减的结果任然是一个函数;函数组签名一致,且输出与输入匹配;

funcs.reduce((a, b) => (...args) => a(b(...args)))

function compose(...funcs) {

return funcs

.reverse()

.reduce((fn1, fn2) => (...args) => fn2(fn1(...args)));

}

四、高阶函数组合,后面的函数作为前一高阶函数的参量输入,通过柯里化函数的局部赋值使函数组函数满足要求(next);

({ getState, dispatch }) => next => action

给({ getState, dispatch }) => next => action签名的函数组分步赋值并进行串联的过程;

整体上是dispatch的method swizzling;

export default function applyMiddleware(...middlewares) {

return (next)  =>

(reducer, initialState) => {

var store = next(reducer, initialState);

var dispatch = store.dispatch;

var chain = [];

//构造初值

var middlewareAPI = {

getState: store.getState,

dispatch: (action) => dispatch(action)

};

//给柯里化函数赋初值:next => action

chain = middlewares.map(middleware => middleware(middlewareAPI));

//next

dispatch = compose(...chain, store.dispatch);

return {

...store,

dispatch

};

};

}

最新文章

  1. JDK下载、安装、配置环境变量笔记
  2. JavaScript可否多线程? 深入理解JavaScript定时机制
  3. UITableView传值(自己使用)(属性,代理传值)
  4. tomcat安装配置.md
  5. nyoj221_Tree_subsequent_traversal
  6. Squid服务日志分析
  7. super和this区别
  8. const和#define常量的区别
  9. css行高line-height的用法(转)
  10. wx
  11. C#写PDF文件类库PDF File Writer介绍
  12. POST和GET的详细解释以及区别
  13. java去除查询实体字段多值之间空格
  14. HDU 1045(炮台安置 DFS)
  15. java代码------charAt()的用法
  16. MySQL主从复制--原理
  17. 【Linux技术】常用的Linux系统调用
  18. am335x 一个按键实现重置 ip 和 root passwd
  19. mini2440移植uboot 2014.04(六)
  20. p4570 [BJWC2011]元素

热门文章

  1. [教程]K8Cscan调用外部程序(Win/Linux批量上控/执行多条命令/保存结果)
  2. 数据结构部分总结(c语言版)
  3. 干货|Dubbo社区开发者日经验分享
  4. 使用ASP.NET Core MVC应用程序中的ResponseCache属性处理缓存(转载)
  5. ELK部署配置使用记录
  6. Node.js 连接 MongoDB数据库
  7. vue.js 如何加载本地json文件
  8. CSS文本单行或者多行超出区域省略号(...)显示方法
  9. springboot-发布jar包
  10. layui扩展组件sliderVerify 实现滑块验证