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