摘要:中的是實際的調(diào)用順序是和傳入中間件順序相反的實際的執(zhí)行是次序是。這個返回的函數(shù)是中倒數(shù)第二個函數(shù)的參數(shù),也就是參數(shù)源碼參考
中間件執(zhí)行順序
應(yīng)用了如下的中間件: [A, B, C],
整個執(zhí)行 action 的過程為 A -> B -> C -> dispatch -> C -> B -> A
==經(jīng)過applyMiddleware方法后的dispatch方法是類似下面,某處調(diào)用store.dispatch則傳入action, 然后按洋蔥模型來執(zhí)行==
(action) => { //... next(action) //... }
==最右側(cè)的 next(action)返回的是應(yīng)用傳入的action==, 該行為是由redux createStore源碼中dispatch方法返回值決定的,不過一般都會 return next(action),
前面的中間件的next(action)的值都是后一個中間件的返回值
小例子const middleware1 = ({getState, dispatch}) => next => action => { console.log(`middleware1 before next action `) console.log(next) next(action) console.log(`middleware1 after next action `) } const middleware2 = ({getState, dispatch}) => next => action => { console.log(`middleware2 before next action `) console.log(next) next(action) console.log(`middleware2 after next action `) } const middleware3 = ({getState, dispatch}) => next => action => { console.log(`middleware3 before next action `) console.log(next) next(action) console.log(`middleware3 after next action `) } const sagaMiddleware = createSagaMiddleware() const store = createStore(reducer, applyMiddleware(middleware1, middleware2, middleware3))被中間件包裝過的dispatch方法
是類似于func1(func2(store.dispatch))這種形式的函數(shù)
==next方法其實是此中間件右邊中間件的這個方法,你要給它傳action。==
(action) => { //func2中的next是store.dispatch next(action); }
==實際的調(diào)用順序是和傳入中間件順序相反的==
let store = applyMiddleware(Middleware1,Middleware2,Middleware3)(createStore)(rootReducer); 實際的執(zhí)行是次序是store.dispatch->Middleware3->Middleware2->Middleware1。middlewareAPI中的dispatch被普通函數(shù)包裝了一下
var middlewareAPI = {
getState: store.getState, dispatch: (action) => dispatch(action)
};
并沒有直接使用dispatch:dispatch,而是使用了dispatch:(action) => dispatch(action),其目的是==如果使用了dispatch:dispatch,那么在所有的Middleware中實際都引用的同一個dispatch(閉包),如果存在一個中間件修改了dispatch,就會導(dǎo)致后面一下一系列的問題==,但是如果使用dispatch: (action) => dispatch(action)就可以避免這個問題。
compose源碼export default function compose(...funcs) { if (funcs.length === 0) { return arg => arg } if (funcs.length === 1) { return funcs[0] } const last = funcs[funcs.length - 1] const rest = funcs.slice(0, -1) return (...args) => rest.reduceRight((composed, f) => f(composed), last(...args)) }applyMiddleware 源碼
這里chain是函數(shù)數(shù)組。然后執(zhí)行compose(...chain)(store.dispatch)。
chain數(shù)組的最后一個函數(shù)接收store.dispatch函數(shù)做為參數(shù),還是返回一個函數(shù),接收action作為參數(shù)。這個返回的函數(shù)是chain中倒數(shù)第二個函數(shù)的參數(shù),也就是參數(shù)next
[ next => action => { return next(action) } ]
export default function applyMiddleware(...middlewares) { return (createStore) => (reducer, preloadedState, enhancer) => { var store = createStore(reducer, preloadedState, enhancer) var dispatch = store.dispatch var chain = [] var middlewareAPI = { getState: store.getState, dispatch: (action) => dispatch(action) } chain = middlewares.map(middleware => middleware(middlewareAPI)) dispatch = compose(...chain)(store.dispatch) return { ...store, dispatch } } }redux-thunk源碼
function createThunkMiddleware(extraArgument) { return ({ dispatch, getState }) => next => action => { if (typeof action === "function") { return action(dispatch, getState, extraArgument); } return next(action); }; } const thunk = createThunkMiddleware(); thunk.withExtraArgument = createThunkMiddleware; export default thunk;參考
https://github.com/MrErHu/blo...
https://zhuanlan.zhihu.com/p/...
https://zhuanlan.zhihu.com/p/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93720.html
摘要:調(diào)用鏈中最后一個會接受真實的的方法作為參數(shù),并借此結(jié)束調(diào)用鏈。總結(jié)我們常用的一般是除了和之外的方法,那個理解明白了,對于以后出現(xiàn)的問題會有很大幫助,本文只是針對最基礎(chǔ)的進行解析,之后有機會繼續(xù)解析對他的封裝 前言 雖然一直使用redux+react-redux,但是并沒有真正去講redux最基礎(chǔ)的部分理解透徹,我覺得理解明白redux會對react-redux有一個透徹的理解。 其實,...
摘要:當(dāng)你應(yīng)用了中間件,在觸發(fā)一個操作的時候,操作就會經(jīng)過先經(jīng)過中間件,最終再形成。以其中兩個中間件為例,說明下,一個觸發(fā)一個動作的時候,代碼的執(zhí)行邏輯。 為了解析中間件,先看一下幾個中間件是什么樣子,怎么用,運行起來的原理是什么? 1、中間件是什么樣子的 1.2 thunk中間件 function createThunkMiddleware(extraArgument) { retu...
摘要:我們可以為元素添加屬性然后在回調(diào)函數(shù)中接受該元素在樹中的句柄,該值會作為回調(diào)函數(shù)的第一個參數(shù)返回。使用最常見的用法就是傳入一個對象。單向數(shù)據(jù)流,比較有序,有便于管理,它隨著視圖庫的開發(fā)而被概念化。 面試中問框架,經(jīng)常會問到一些原理性的東西,明明一直在用,也知道怎么用, 但面試時卻答不上來,也是挺尷尬的,就干脆把react相關(guān)的問題查了下資料,再按自己的理解整理了下這些答案。 reac...
摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅持每天花分鐘來學(xué)習(xí)與思考。 今天的React題沒有太多的故事…… 半個月前出了248個Vue的知識點,受到很多朋友的關(guān)注,都強烈要求再出多些React相前的面試題,受到大家的邀請,我又找了20多個React的使用者,他們給出了328道React的面試題,由我整理好發(fā)給大家,同時發(fā)布在了前端面試每日3+1的React專題,希望對大家有所幫助,同時大...
摘要:特點集中處理副作用問題異步實現(xiàn)為監(jiān)聽執(zhí)行的工作形式主要是借鑒模式和使用進行實現(xiàn)的。返回的遍歷器對象,可以依次遍歷函數(shù)內(nèi)部的每一個狀態(tài)。為了方便,下文中是的簡稱。若任務(wù)仍在運行中則為任務(wù)拋出的錯誤。由于循環(huán),再次執(zhí)行。 介紹redux-saga使用和常用api介紹的文章很多,但是真正介紹原理的卻很少,下面我用自己的思路講一下redux-saga的執(zhí)行過程。源碼有很多刪減,感興趣的可自行查...
摘要:作為目前最火的模式實現(xiàn)之一,它有很多的點值得研究。這個函數(shù)既然要用于,也就是說它接收一個形式為的函數(shù),對其一層層嵌套形式為。這個會在開始時發(fā)起一個,并在這個時發(fā)起另一個成功或失敗的。為了方便起見,會返回這個讓調(diào)用者可以等待。 Redux作為目前最火的Flux模式實現(xiàn)之一,它有很多的點值得研究。今天我們首先來看看它的Middleware。 熟悉Express或者koa的朋友對Middle...
閱讀 1216·2023-04-26 00:47
閱讀 3569·2021-11-16 11:53
閱讀 796·2021-10-08 10:05
閱讀 2740·2021-09-22 15:19
閱讀 2982·2019-08-30 15:55
閱讀 2756·2019-08-29 16:55
閱讀 2922·2019-08-29 15:20
閱讀 1112·2019-08-23 16:13