前言
最近在试着把自己写的 koa-vuessr-middleware 应用在旧项目中时,因为旧项目Koa 版本为1.2,对中间件的支持不一致,在转化之后好奇地读了一下源码,整理了一下对Koa 中next 在两个版本中的意义及相互转换的理解
正文
1.x 中的next
从Koa 的 application.js 中找到中间件部分的代码,可以看出,use 传入的中间件被放入一个middleware 缓存队列中,这个队列会经由 koa-compose
进行串联
app.use = function(fn){
// ...
this.middleware.push(fn);
return this;
};
// ...
app.callback = function(){
// ...
var fn = this.experimental
? compose_es7(this.middleware)
: co.wrap(compose(this.middleware));
// ...
};
复制代码
而进入到koa-compose
中,可以看到compose 的实现很有意思(无论是在1.x 还是在2.x 中,2.x 可以看下面的)
function compose(middleware){
return function *(next){
if (!next) next = noop();
var i = middleware.length;
while (i--) {
next = middleware[i].call(this, next);
}
return yield *next;
}
}
// 返回一个generator 函数
function *noop(