Koa中间件执行yield next逆序问题

当中间件运行到 yield next 时,函数挂起并将控制前交给下一个中间件。当没有中间件执行 yield next 时,程序栈会逆序唤起被挂起的中间件来执行接下来的代码。 例如代码如下:

var koa = require('koa');  
var app = koa();

app.use(function *(next){  
  console.log(1);
  yield next;
  console.log(2);
});

// logger

app.use(function *(next){  
  console.log(3);
  yield next;
  console.log(4);
});

// response

app.use(function *(){  
  console.log(5);
  this.body = 'Hello World';
});

app.listen(3000);  

执行结果是:

1  
3  
5  
4  
2  

很明显,中间件会依次执行,但是执行到yield next的时候回暂停当前中间件后面的的代码,等没有中间件执行yield next的时候会按照中间件的定义顺序逆序执行,上面例子逆序执行输出的是4和2,很好理解吧~~