從函式的柯里化,看Redux中介軟體的實現

2021-07-25 12:32:05 字數 1717 閱讀 2121

簡介:同步請求時,dispatch(action)發出請求,到接受請求reducer(state,action)是同步的。如果當我們需要非同步請求時,狀態應該變為dispatch(action)——wait()——reducer(state,action)。處理非同步的函式wait(),就是中介軟體的概念,也就是發出請求後,並不是同步馬上執行的,引入中介軟體後:

dispatch(action)——中介軟體——reducer(state,action)

1.首先來看什麼是函式的柯里化?

(1)柯里化是把接受多個引數的函式變換成接受乙個單一引數(最初函式的第乙個引數)的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。

簡單來說:我們要實現1,2,3,4的求和

function

sum(x,y,z,q)

sum(1,2,3,4);//得到10

我們從上可以看出,sum函式傳遞了4個引數,函式的柯里化,是指將函式的引數變為1個,並且返回新的函式,柯里化後:

function

sum(x)}}}

sum(1)(2)(3)(4) //得到sum為10

我們可以看出,函式柯里化後,每次呼叫只傳遞乙個引數,並且每次呼叫後會返回新的函式。

(2)es6中,箭頭函式下的函式柯里化

var

sum=(x)=>

(y)=>

(z)=>

(q)=>(x+y+z+q)

等價於:

var sum=funstion(x)}}}

sum(1)(2)(3)(4);//得到值為10

function

middlewares = middlewares.slice()

middlewares.reverse()

let dispatch = store.dispatch

middlewares.foreach(middleware =>

dispatch = middleware(store)(dispatch)

) return object.assign({}, store, )

}

依次實現middlewares中的方法,並且對於每乙個方法重新封裝store.dispatch方法。

middlewares.foreach(middleware =>

dispatch = middleware(store)(dispatch)

)

這一句**就是核心,我們發現,對於每乙個中介軟體,首先執行這個中介軟體,並且對於每乙個中介軟體,執行後重新定義dispatch方法。

3.redux中,中介軟體的定義。

const logger = store=> next=> action=>

會依次middlewares陣列中的方法,並且每次執行都重新封裝store.dispatch,函式柯里化在**體現呢?

middlewares.foreach(middleware =>

dispatch = middleware(store)(dispatch)

)

這裡體現了函式柯里化,每次執行乙個中介軟體,middleware(store)(dispatch),第二個括號內的(dispatch),傳遞給了具體函式的next。

函式柯里化

在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。在直覺上,柯里化聲稱 如果你固定某些引數,你將得到接受餘下引數的乙個函式 柯里化實現的原理 在函式式程式語言中,將函式可以當做物件傳遞呼...

函式柯里化

curry 的概念 只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數先看乙個簡單例子,add函式接受 2 個引數 或者多個 addx函式接受 1 個引數。換而言之,所謂 柯里化 就是把乙個多引數的函式,轉化為單引數函式。將乙個函式轉換為乙個新的函式 非柯里化 function add...

函式柯里化

curry 的概念 只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數先看乙個簡單例子,add函式接受 2 個引數 或者多個 addx函式接受 1 個引數。換而言之,所謂 柯里化 就是把乙個多引數的函式,轉化為單引數函式。將乙個函式轉換為乙個新的函式 非柯里化 function add...