i==4,index==3 i>index 往下
index=4fn=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(){









