洋葱模型切面

前言

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       |            |           |
        |          |            |                                 |            |           |
+---------------------------------------------------------------------------------------------------->
        |          |            |                                 |            |           |
        |          |            |                                 |            |           |
        |          |            +---------------------------------+            |           |
        |          +-----------------------------------------------------------+           |
        +----------------------------------------------------------------------------------+

results matching ""

    No results matching ""