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和middleware3Promise.resolve(middleware)嵌套中执行中间件middleware1 前置操作 action 001middleware2middleware2 前置操作 action 002middleware3middleware3 前置操作 action 003middleware3 后置操作 action 004middleware2 后置操作 action 005middleware1 后置操作 action 006+----------------------------------------------------------------------------------+| || middleware 1 || || +-----------------------------------------------------------+ || | | || | middleware 2 | || | | || | +---------------------------------+ | || | | | | || action | action | middleware 3 | action | action || 001 | 002 | | 005 | 006 || | | action action | | || | | 003 004 | | || | | | | |+---------------------------------------------------------------------------------------------------->| | | | | || | | | | || | +---------------------------------+ | || +-----------------------------------------------------------+ |+----------------------------------------------------------------------------------+