func-package

函数库, 面向复杂业务场景的 js 类库

洋葱模型切面

前言

Koa.js 最为人所知的是基于 洋葱模型 的HTTP中间件处理流程。

在此,洋葱模式可以拆解成一下几个元素。

  • 生命周期
  • 中间件
  • 中间件在生命周期中
    • 前置操作
    • 等待其他中间件操作
    • 后置操作

中间件流程处理

  • 举个代码例子
let context = {
data: []
};
async function middleware1(ctx, next) {
console.log('action 001');
ctx.data.push(1);
await next();
console.log('action 006');
ctx.data.push(6);
}
async function middleware2(ctx, next) {
console.log('action 002');
ctx.data.push(2);
await next();
console.log('action 005');
ctx.data.push(5);
}
async function middleware3(ctx, next) {
console.log('action 003');
ctx.data.push(3);
await next();
console.log('action 004');
ctx.data.push(4);
}
Promise.resolve(middleware1(context, async() => {
return Promise.resolve(middleware2(context, async() => {
return Promise.resolve(middleware3(context, async() => {
return Promise.resolve();
}));
}));
}))
.then(() => {
console.log('end');
console.log('context = ', context);
});
// 结果显示
// "action 001"
// "action 002"
// "action 003"
// "action 004"
// "action 005"
// "action 006"
// "end"
// "context = { data: [1, 2, 3, 4, 5, 6]}"
  • 源码元素解析
    • 生命周期就是 Promise.resolve 的嵌套
    • 中间件就是 middleware1middleware2middleware3
    • 中间件在生命周期中,就是 Promise.resolve(middleware)嵌套中执行中间件
      • middleware1 前置操作 action 001
      • 等待嵌套的 middleware2
        • middleware2 前置操作 action 002
        • 等待嵌套的 middleware3
          • middleware3 前置操作 action 003
          • middleware3 后置操作 action 004
        • middleware2 后置操作 action 005
      • middleware1 后置操作 action 006
+----------------------------------------------------------------------------------+
| |
| middleware 1 |
| |
| +-----------------------------------------------------------+ |
| | | |
| | middleware 2 | |
| | | |
| | +---------------------------------+ | |
| | | | | |
| action | action | middleware 3 | action | action |
| 001 | 002 | | 005 | 006 |
| | | action action | | |
| | | 003 004 | | |
| | | | | |
+---------------------------------------------------------------------------------------------------->
| | | | | |
| | | | | |
| | +---------------------------------+ | |
| +-----------------------------------------------------------+ |
+----------------------------------------------------------------------------------+