中介軟體的實現
reduce
用於函式
中介軟體模式(middleware)是一種很常見、也很強大的模式,被廣泛應用在 express、koa、redux 等類庫和框架當中。
簡單來說,中介軟體就是在呼叫目標函式之前,你可以隨意插入其他函式預先對資料進行處理、過濾,在這個過程裡面你可以列印資料、或者停止往下執行中介軟體等。資料就像水流一樣經過中介軟體的層層的處理、過濾,最終到達目標函式。請你模擬乙個中介軟體模式,可以達到以下效果:
callback (ctx) ,
use (fn) ,
go (ctx)
} ctx.name = 'lucy'
next()
}) ctx.age = 12
next()
}) console.log(`$ is $ years old.`) // => lucy is 12 years old.
next()
})// ... 任意呼叫 use 插入中介軟體
next
方法是乙個遞迴呼叫的函式,需要作為引數傳遞給中介軟體的第二個引數
所以實現如下:
target: null,
middlewares: ,
index: -1,
callback(ctx) ,
use(fn) ,
go(ctx) else
};execute()
}};本來想用generator實現,結果搗鼓了半天沒成功o(╯□╰)o
後來翻了翻討論區,大神真的厲害,用reduceright
一行**實現了我上面go
裡面的一坨東西
reduce
確實很強大,以前用它來處理物件、字串、數值、陣列,這次要用它處理函式。
假設有這樣四個函式組成的陣列,想讓他們按照1
至4
的順序執行,用reduceright
實現,如何實現呢
const fn1 = () => ;
const fn2 = () => ;
const fn3 = () => ;
const fn4 = () => ;
實際上我們利用了reduce
來當做乙個工具,不斷返回乙個新的函式,在返回新的函式時將當前遍歷的函式壓入到了新的函式中
[fn1, fn2, fn3, fn4].reduceright((total, current) => () => )()
實際上reduceright
返回的陣列是這樣乙個過程
最後執行的是x1
,所以能夠按照1到4的順序執行函式
那現在假設有乙個callback
陣列,我們不想把它加入到函式組成的陣列中,想最後執行它,該怎麼辦呢?
通過上面的例項我們已經知道,reduce
構建函式的過程與最後執行的熟悉是相反的,想最後執行callback
,就應該將它最先用reduce
處理
所以我們可以將這個callback
放到reduce
的第二個引數,作為初始值傳給total
[fn1, fn2, fn3, fn4].reduceright((total, current) => () => , () => callback())()
這時流程圖變成了:
在回到我們上面的題目來,題目與例子區別就在於,當current
對應的函式執行完,total
的函式是否執行是由next
函式在外部控制的,而next
函式是fn
函式的引數,所以將total
作為引數傳給current
:
const fn1 = (next) => ;
const fn2 = (next) => ;
const fn3 = (next) => ;
const fn4 = (next) => ;
const callback = () => ;
[fn1, fn2, fn3, fn4].reduceright((total, current) => () => , () => callback())()
流程圖如下:
現在基本上與題目的實現差不多了
middlewares: ,
callback(ctx) ,
use(fn) ,
go(ctx)
}reduce
和reduceright
真的是乙個非常強大的工具,很多需要遞迴的地方都可以用這個方法搞定
reduce
處理函式相當於不斷生成一層套一層的類似於站堆疊結構的函式,構建的順序是從內向外的,而執行的時候是從外向內的,與reduce
的執行順序相反
程式設計師的10x法則果然很準,乙個10x程式設計師用一行**就能實現我這樣的一般程式設計師需要10行**才能實現的功能,路漫漫其修遠,努力吧。
13 2 7 中介軟體
中介軟體顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能。如果你想修改請求,例如被傳送到view中的httprequest物件。或者你想修改view返回的htt...
21 中介軟體
一 中介軟體的定義 1.中介軟體是django請求 響應處理的鉤子框架,它是乙個輕量級的 低階的 外掛程式 系統,用於全域性改變django的輸入或輸出 2.中介軟體以類的形式體現 3.每個中介軟體元件負責做一些特定的功能,例如django包含乙個中介軟體元件 authenticationmiddl...
07 中介軟體
5 獲取的資料會交給最後乙個中介軟體的process response方法處理,然後依次向前面的中介軟體process response 6 在任一中介軟體的process request和process view方法中有返回值就會直接返回給process response 3 檢視函式 4 中介軟...