中间件与 Redux 与 Koa

compose 函数

/**
 * 接受一组函数,返回一个函数,该函数从右向左执行传入的函数,函数执行的结果作为下一个函数的参数,返回最后一个函数执行结果
 * reduce的数组如果空数组,且reduce参数没有初始值,会报错
 * reduce的数组如果只有一个元素,且reduce参数没有初始值,会直接返回数组中的唯一元素
 * @param  {...any} fns 一组函数
 */
const compose = (...fns) =>
  fns.reduce(
    (prev, cur) =>
      (...x) =>
        prev(cur(...x))
  )

简单的中间件实现

  • compose 的不足:只能内层执行完再执行外层,无法实现洋葱模型似的中间件

  • 中间件接受一个 next 函数,返回一个函数 A。

    1. A 可在 next 执行前做一些处理(修改参数等)

    2. A 可在 next 执行后做一些处理(修改结果等)

  • applyMiddleware 接收初始函数,和中间件数组,通过类似 compose 的方式,返回一个加强后的函数

redux 中的中间件

  • 从下面代码看到,redux 的中间件还要多包一层(传入{getState,dispatch}),通过 const chain = middlewares.map(middleware => middleware(middlewareAPI))转化成我们上面的中间件形式

  • 然后 redux 在组合中间件时,采用了延迟传入基础函数的方式compose(...chain)(store.dispatch)

  1. 中间件形式:({getState,dispatch})=>next=>action=>{...}

  2. 通过 applyMiddleware 和 compose 组合来加强 dispatch

Koa 中的中间件

  • Koa 使用了koa-compose组合中间件

  • koa 中的中间件组合:返回一个函数,该函数从第一个中间件开始执行,执行中间件时传入下一个中间件的执行器(dispatch)。

为 fetch 添加中间件

  • 保留 fetch 的原生语法,按需添加中间件,逻辑清晰

最后更新于

这有帮助吗?