傻瓜式解读koa中间件处理模块koa-compose的使用

2020-06-17 06:53:24易采站长站整理

i==4,index==3 i>index 往下


index=4

fn=middleware[4]

fn=undefined

reuturn Promise.resolve('fn is undefined')

回到next执行上下文


console.log('middleware 4');

输出middleware 4


return 'middleware 4 return'
Promise.resolve('middleware 4 return')

回到f3执行上下文


console.log('middleware 3');

输出middleware 3


return 'middleware 3 return'
Promise.resolve('middleware 3 return')

回到f2执行上下文


console.log('middleware 2');

输出middleware 2


return 'middleware 2 return'
Promise.resolve('middleware 2 return')

回到f1执行上下文


console.log('middleware 1');

输出middleware 1


return 'middleware 1 return'
Promise.resolve('middleware 1 return')

回到全局上下文

至此已经输出

“middleware 1”

“middleware 2”

“middleware 3”

“middleware 4”

“middleware 4”

“middleware 3”

“middleware 2”

“middleware 1”

那么

“fn is undefined”

“middleware 4 return”

“middleware 3 return”

“middleware 2 return”

“middleware 1 return”

怎么来的呢

回头看一下,每个中间件里都有

next().then(data=>console.log(data));

按照之前的分析,then里最先拿到结果的应该是next中间件的,而且结果就是Promise.resolve(‘fn is undefined’)的结果,然后分别是f4,f3,f2,f1。那么为什么都是最后才输出呢?


Promise.resolve('fn is undefined').then(data=>console.log(data));
console.log('middleware 4');

运行一下就清楚了

或者


setTimeout(()=>console.log('fn is undefined'),0);
console.log('middleware 4');

整个调用过程还可以看成是这样的:


function composeDetail(){
return Promise.resolve(
f1(context,function(){
return Promise.resolve(
f2(context,function(){
return Promise.resolve(
f3(context,function(){
return Promise.resolve(
next(context,function(){