中间件与 Redux 与 Koa
compose 函数
/**
* 接受一组函数,返回一个函数,该函数从右向左执行传入的函数,函数执行的结果作为下一个函数的参数,返回最后一个函数执行结果
* reduce的数组如果空数组,且reduce参数没有初始值,会报错
* reduce的数组如果只有一个元素,且reduce参数没有初始值,会直接返回数组中的唯一元素
* @param {...any} fns 一组函数
*/
const compose = (...fns) =>
fns.reduce(
(prev, cur) =>
(...x) =>
prev(cur(...x))
)简单的中间件实现
compose 的不足:只能内层执行完再执行外层,无法实现洋葱模型似的中间件
中间件接受一个 next 函数,返回一个函数 A。
A 可在 next 执行前做一些处理(修改参数等)
A 可在 next 执行后做一些处理(修改结果等)
applyMiddleware 接收初始函数,和中间件数组,通过类似 compose 的方式,返回一个加强后的函数
redux 中的中间件
从下面代码看到,redux 的中间件还要多包一层(传入{getState,dispatch}),通过
const chain = middlewares.map(middleware => middleware(middlewareAPI))转化成我们上面的中间件形式然后 redux 在组合中间件时,采用了延迟传入基础函数的方式
compose(...chain)(store.dispatch)
中间件形式:({getState,dispatch})=>next=>action=>{...}
通过 applyMiddleware 和 compose 组合来加强 dispatch
Koa 中的中间件
Koa 使用了koa-compose组合中间件
koa 中的中间件组合:返回一个函数,该函数从第一个中间件开始执行,执行中间件时传入下一个中间件的执行器(dispatch)。
为 fetch 添加中间件
保留 fetch 的原生语法,按需添加中间件,逻辑清晰
最后更新于
这有帮助吗?