按照之前的分析,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(){ return Promise.resolve('fn is undefined') }) ) }) ) }) ) }) ) } composeDetail().then(data=>console.log(data));
方法虽蠢,但是compose的作用不言而喻了
最后,if (i <= index) return Promise.reject(new Error('next() called multiple times'))这句代码何时回其作用呢?
一个中间件里调用两次next(),按照上面的套路走,相信很快就明白了。