前言
最近一直在用koa,就很好奇koa的中间件是如何实现的,多个中间件之间的关系和执行顺序又是怎样的?下面咱们一块儿来看看吧。程序员
举个 🌰
输出就不写了,还不清楚的同窗自行尝试下数组
app.use作了什么
过滤掉一些暂时用不到的代码app
预先经过use方法,将请求可能会通过的中间件装在了一个数组里
callback
经过
compose()
这个方法,就将咱们传入的中间件数组关联起来了,最后
callback()
返回
this.handleRequest()
的执行结果,暂无论返回什么吧,先看看这个神奇的
compose()
方法作了什么使得文章最开始的例子能够那样执行
compose
- 首先会默认执行第一个中间件,返回 Promise,被 Koa 监听,执行对应逻辑
- 在执行第一个中间件的逻辑时,遇到 await next()时,会继续执行 dispatch(i+1),也就是执行 dispatch(1),会手动触发执行第二个中间件。这时候,第一个中间件 await next() 后面的代码就会被 pending,等待 await next() 返回 Promise,才会继续执行第一个中间件 await next() 后面的代码。
- 以此类推,若是有多个中间件的时候,会依照上面的逻辑不断执行,先执行第一个中间件,在 await next() 出 pending,继续执行第二个中间件,继续在 await next() 出 pending,继续执行第三个中间,直到最后一个中间件执行完,而后返回 Promise,而后倒数第二个中间件才执行后续的代码并返回Promise,而后是倒数第三个中间件,接着一直以这种方式执行直到第一个中间件执行完,并返回 Promise,从而实现开头例子的执行顺序,就比如下面网上很火的一张洋葱图
总结
koa 真香,这 compose() 函数真骚,因此说评价一个好的程序员不是由代码量决定的koa