https://www.cnblogs.com/cloud-/p/7239819.html
const Koa = require('koa'); const app = new Koa(); app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = Date.now() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}`); }); app.listen(3000);
我們順藤摸瓜,打開 koa里面的application.js (或者直接debug進入),
1.首先看 use ,就是push一個函數到 this.middleware
2. 再看listen, 方法里面 http.createServer(this.callBack), this.callBack返回的是 function(req,res){......}的函數,連起來就是 http.createServer(function(req,res){....}),標准的http創建服務的方法
3. 最后看callback,里面的核心方法, compose(this.middleware) 返回一個promise,處理完畢后再執行 handleResponse
這三個連起來,就是每次請求的時候,先進入callback, compose中間件,執行完畢后,接着處理請求。那剩下的重點變為 compose
與上面的參數對應關系如下
context :ctx,
next : function next(){ return dispatch(i+1)}
所以 await next() 就等於 await function next(){ return dispatch(i+1)} , 而 dispatch(i+1)就進入了下一個中間件了。
核心就是 dispatch(i+1),也就是dispatch(1) , dispatch本身返回promise, 所以你就在這里 await 。
依此類推 disptach(1) 會執行 this.middleware[1], 那個時候 fn就為 logger執行的函數,就這么推下去。
關於結束,還是 next 不存在的時候。 結果完畢后,再依次往上走。
所以執行的順序是越先注冊越后執行, 當然還得看你 await next() 放在什么位置。 因為這里我的 console.log都放在了 await的后面,都放到前面,結果如何,親自測試一下嘍。