前言
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的嵌套 - 中间件就是
middleware1、middleware2和middleware3 - 中间件在生命周期中,就是
Promise.resolve(middleware)嵌套中执行中间件middleware1前置操作action 001- 等待嵌套的
middleware2middleware2前置操作action 002- 等待嵌套的
middleware3middleware3前置操作action 003middleware3后置操作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 | | || | | | | |+---------------------------------------------------------------------------------------------------->| | | | | || | | | | || | +---------------------------------+ | || +-----------------------------------------------------------+ |+----------------------------------------------------------------------------------+
- 生命周期就是
