Koa2中間件原理

前言

最近一直在用koa,就很好奇koa的中間件是如何實現的,多箇中間件之間的關係和執行順序又是怎樣的?下面咱們一塊兒來看看吧。程序員

舉個 🌰

輸出就不寫了,還不清楚的同窗自行嘗試下數組

app.use作了什麼

過濾掉一些暫時用不到的代碼app

預先經過use方法,將請求可能會通過的中間件裝在了一個數組裏

callback

經過 compose() 這個方法,就將咱們傳入的中間件數組關聯起來了,最後 callback() 返回 this.handleRequest() 的執行結果,暫無論返回什麼吧,先看看這個神奇的 compose() 方法作了什麼使得文章最開始的例子能夠那樣執行

compose

  1. 首先會默認執行第一個中間件,返回 Promise,被 Koa 監聽,執行對應邏輯
  2. 在執行第一個中間件的邏輯時,遇到 await next()時,會繼續執行 dispatch(i+1),也就是執行 dispatch(1),會手動觸發執行第二個中間件。這時候,第一個中間件 await next() 後面的代碼就會被 pending,等待 await next() 返回 Promise,纔會繼續執行第一個中間件 await next() 後面的代碼。
  3. 以此類推,若是有多箇中間件的時候,會依照上面的邏輯不斷執行,先執行第一個中間件,在 await next() 出 pending,繼續執行第二個中間件,繼續在 await next() 出 pending,繼續執行第三個中間,直到最後一箇中間件執行完,而後返回 Promise,而後倒數第二個中間件才執行後續的代碼並返回Promise,而後是倒數第三個中間件,接着一直以這種方式執行直到第一個中間件執行完,並返回 Promise,從而實現開頭例子的執行順序,就比如下面網上很火的一張洋蔥圖

總結

koa 真香,這 compose() 函數真騷,因此說評價一個好的程序員不是由代碼量決定的koa

相關文章
相關標籤/搜索