node框架——koa
如下是koa的基本语法(koa 需进行npm等方式进行安装)
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
ctx.body = '1';
await next();
ctx.body += '2';
});
app.use(async (ctx, next) => {
ctx.body += '3';
await next();
ctx.body += '4'
});
app.use(async (ctx, next) => {
ctx.body += '5';
});
app.listen(3000);
在页面上显示的结果是: 1 3 5 4 2;,这是这个框架非常核心的一个地方洋葱圈模式
洋葱圈模型
这就是该模型的抽象图,如果这图不好理解的话,实际上看代码会好理解一些,await next() 这里实际上就是进入到了下一个use里去,如果下一个use中还有next 那就继续进入到下一个use中 如果没有了,那就返回到最近一个的await next()中去执行后面的代码 执行完成后又接着去寻找最近一个await next()
洋葱圈模式简略实现方案
compose(middlewares) {
return function(ctx) {
return dispatch(0);
function dispatch(i) {
let fn = middlewares[i];
if (!fn) {
return Promise.resolve()
}
return Promise.resolve(
fn(
ctx,
function next() {
return dispatch(i + 1)
}
)
)
}
}
}
compose 方法中的参数实际上就是调用use方法是 将callback添加到了middleware数组中,在compose里执行递归调用,这里ctx是上下文的概念,koa中将respones,requset整合到了ctx中方便对外暴露,整合本质就是利用了对象中的set 与 get方法