前言
最近一直在用koa,就很好奇koa的中間件是如何實現的,多箇中間件之間的關係和執行順序又是怎樣的?下面咱們一塊兒來看看吧。程序員
舉個 🌰
輸出就不寫了,還不清楚的同窗自行嘗試下數組
app.use作了什麼
過濾掉一些暫時用不到的代碼app
預先經過use方法,將請求可能會通過的中間件裝在了一個數組裏
callback
經過
compose()
這個方法,就將咱們傳入的中間件數組關聯起來了,最後
callback()
返回
this.handleRequest()
的執行結果,暫無論返回什麼吧,先看看這個神奇的
compose()
方法作了什麼使得文章最開始的例子能夠那樣執行
compose
- 首先會默認執行第一個中間件,返回 Promise,被 Koa 監聽,執行對應邏輯
- 在執行第一個中間件的邏輯時,遇到 await next()時,會繼續執行 dispatch(i+1),也就是執行 dispatch(1),會手動觸發執行第二個中間件。這時候,第一個中間件 await next() 後面的代碼就會被 pending,等待 await next() 返回 Promise,纔會繼續執行第一個中間件 await next() 後面的代碼。
- 以此類推,若是有多箇中間件的時候,會依照上面的邏輯不斷執行,先執行第一個中間件,在 await next() 出 pending,繼續執行第二個中間件,繼續在 await next() 出 pending,繼續執行第三個中間,直到最後一箇中間件執行完,而後返回 Promise,而後倒數第二個中間件才執行後續的代碼並返回Promise,而後是倒數第三個中間件,接着一直以這種方式執行直到第一個中間件執行完,並返回 Promise,從而實現開頭例子的執行順序,就比如下面網上很火的一張洋蔥圖
總結
koa 真香,這 compose() 函數真騷,因此說評價一個好的程序員不是由代碼量決定的koa