後端基礎掃盲 koa洋蔥圈原理

2021-09-26 16:20:00 字數 1562 閱讀 1651

首先平時我們寫middle ware都是像下面這樣對不對?

async

function

fn1(next)

async

function

fn2(next)

async

function

fn3(next)

next方法是koa框架給我們的工具,那如果沒有這個next我們怎麼才能一層層呼叫下乙個方法呢?我首先想到的就是 await/async,那就去掉next方法並自己動手改造一下!**如下:

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()

)})

這個**很容易理解,乙個個中介軟體就像被一條鍊子穿起來一樣,為了可以讓當前的中介軟體可以呼叫下乙個中介軟體我至少得把下乙個中介軟體的引用傳給它,就比如我想讓fn2調fn3,我就得把fn3的引用當做引數傳給fn2,上面**中nextmiddlewarepointer就是下乙個中介軟體的引用。最後在呼叫這個中介軟體鏈的時候,寫法必然是一層套一層的,並且因為我們是把函式當做引用傳進去供其呼叫,所以要在fn外面套一層函式,避免被直接呼叫。

下面開始優化上面**,既然****現了層層巢狀的寫法那就必然可以替換成遞迴!下面就把它改造成遞迴。**如下:

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()

;

最後把compose函式再改造一下,如下:

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...