KOA、Redux、中间件,Promise,next等等
简单看一下koa和redux中中间件的实现
KOA

我们先来看一下koa中间件的用法,copy一个官网的例子
打印结果

koa的中间件,其实主要是koa-compose实现的,use方法是将函数推入队列当中,listen函数中会调用compose返回一个函数,在每次请求时,会去调用这个函数。我们主要看一下compose函数的实现
compose函数接收的是middleware的队列,就是前面使用use将所有middleware推入的队列。返回的也是一个函数,在每次处理请求时,其实执行的是返回的函数。我们将返回的函数简单处理一下。
这个函数结果context、next两个参数,返回了dispatch(0)的执行结果,dispatch函数接收一个index参数,通过index获取到当前执行的中间件fn,然后执行fn(context, dispatch.bind(null, i + 1))。
从dipatch(0)开始执行,其实就是将中间件通过dispatch函数去执行,控制入栈时机。
如果我们修改一下代码,将第一个函数去掉async,那么打印的顺序也会发生变化

而本质其实是这么执行的
而 fn2又相当于
相当于将console.log(4)放到了微任务队列,会在当前所有同步代码执行完成后,再去执行。
Redux
redux中间件是在 dispatch action 的时候和 action 到达 reducer 之间调用的。我们也简单copy一段官网的例子
applyMiddleware返回了一个函数
这块的compose也比较巧妙,而且传入中间件时使用多层函数,使用时通过多次调用最终将store、next传入,形成闭包,也很巧妙。
但是相比koa,store、next作为中间件的参数可能更容易理解。