首先平時我們寫middle ware都是像下面這樣對不對?
next方法是koa框架給我們的工具,那如果沒有這個next我們怎麼才能一層層呼叫下乙個方法呢?我首先想到的就是 await/async,那就去掉next方法並自己動手改造一下!**如下:async
function
fn1(next)
async
function
fn2(next)
async
function
fn3(next)
這個**很容易理解,乙個個中介軟體就像被一條鍊子穿起來一樣,為了可以讓當前的中介軟體可以呼叫下乙個中介軟體我至少得把下乙個中介軟體的引用傳給它,就比如我想讓fn2調fn3,我就得把fn3的引用當做引數傳給fn2,上面**中nextmiddlewarepointer就是下乙個中介軟體的引用。最後在呼叫這個中介軟體鏈的時候,寫法必然是一層套一層的,並且因為我們是把函式當做引用傳進去供其呼叫,所以要在fn外面套一層函式,避免被直接呼叫。async
function
fn1(nextmiddlewarepointer)
console.
log(
'end fn1')}
async
function
fn2(nextmiddlewarepointer)
console.
log(
'end fn2')}
async
function
fn3(nextmiddlewarepointer)
console.
log(
'end fn3')}
fn1(
function()
)})
下面開始優化上面**,既然****現了層層巢狀的寫法那就必然可以替換成遞迴!下面就把它改造成遞迴。**如下:
最後把compose函式再改造一下,如下:function
compose
(middlewarearray)))
;})}
else;}
}}}async
function
fn1(nextmiddlewarepointer)
async
function
fn2(nextmiddlewarepointer)
async
function
fn3(nextmiddlewarepointer)
middlewarearray =
[fn1, fn2, fn3]
;const startfn =
compose
(middlewarearray)
;startfn()
;
這個**其實有不少值得細細玩味的地方,大家自行研究吧!function
compose
(middlewarearray)))
;}else}}
}
koa洋蔥模型
乙個洋蔥來一刀 有圖有真相 等到next 函式執行完成之後,才會next 後面的 那麼洋蔥心就是最後乙個執行完畢的中介軟體,每個next就是洋蔥每一層的分界線 const koa require koa console.log 1 await next console.log 1.1 console...
koa中介軟體梳理(洋蔥模型)
中介軟體概念 koa是乙個精簡的node框架,它主要做了以下事情 基於node原生req和res為request和response物件賦能,並基於它們封裝成乙個context物件。基於async await generator 的中介軟體洋蔥模型機制。koa1和koa2在原始碼上的區別主要是於對非同...
Koa中介軟體機制的洋蔥圈模型
const koa require koa console.log 1 await next console.log 6 console.log 2 await next console.log 5 console.log 3 ctx.body hello world console.log 4 c...