国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

redux中間件原理

jollywing / 2424人閱讀

摘要:中的是實際的調(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

相關(guān)文章

  • Redux原理分析

    摘要:調(diào)用鏈中最后一個會接受真實的的方法作為參數(shù),并借此結(jié)束調(diào)用鏈。總結(jié)我們常用的一般是除了和之外的方法,那個理解明白了,對于以后出現(xiàn)的問題會有很大幫助,本文只是針對最基礎(chǔ)的進行解析,之后有機會繼續(xù)解析對他的封裝 前言 雖然一直使用redux+react-redux,但是并沒有真正去講redux最基礎(chǔ)的部分理解透徹,我覺得理解明白redux會對react-redux有一個透徹的理解。 其實,...

    sumory 評論0 收藏0
  • Redux間件原理詳解

    摘要:當(dāng)你應(yīng)用了中間件,在觸發(fā)一個操作的時候,操作就會經(jīng)過先經(jīng)過中間件,最終再形成。以其中兩個中間件為例,說明下,一個觸發(fā)一個動作的時候,代碼的執(zhí)行邏輯。 為了解析中間件,先看一下幾個中間件是什么樣子,怎么用,運行起來的原理是什么? 1、中間件是什么樣子的 1.2 thunk中間件 function createThunkMiddleware(extraArgument) { retu...

    Shihira 評論0 收藏0
  • React專題:react,redux以及react-redux常見一些面試題

    摘要:我們可以為元素添加屬性然后在回調(diào)函數(shù)中接受該元素在樹中的句柄,該值會作為回調(diào)函數(shù)的第一個參數(shù)返回。使用最常見的用法就是傳入一個對象。單向數(shù)據(jù)流,比較有序,有便于管理,它隨著視圖庫的開發(fā)而被概念化。 面試中問框架,經(jīng)常會問到一些原理性的東西,明明一直在用,也知道怎么用, 但面試時卻答不上來,也是挺尷尬的,就干脆把react相關(guān)的問題查了下資料,再按自己的理解整理了下這些答案。 reac...

    darcrand 評論0 收藏0
  • React 328道最全面試題(持續(xù)更新)

    摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅持每天花分鐘來學(xué)習(xí)與思考。 今天的React題沒有太多的故事…… 半個月前出了248個Vue的知識點,受到很多朋友的關(guān)注,都強烈要求再出多些React相前的面試題,受到大家的邀請,我又找了20多個React的使用者,他們給出了328道React的面試題,由我整理好發(fā)給大家,同時發(fā)布在了前端面試每日3+1的React專題,希望對大家有所幫助,同時大...

    kumfo 評論0 收藏0
  • redux-saga實現(xiàn)與原理

    摘要:特點集中處理副作用問題異步實現(xiàn)為監(jiān)聽執(zhí)行的工作形式主要是借鑒模式和使用進行實現(xiàn)的。返回的遍歷器對象,可以依次遍歷函數(shù)內(nèi)部的每一個狀態(tài)。為了方便,下文中是的簡稱。若任務(wù)仍在運行中則為任務(wù)拋出的錯誤。由于循環(huán),再次執(zhí)行。 介紹redux-saga使用和常用api介紹的文章很多,但是真正介紹原理的卻很少,下面我用自己的思路講一下redux-saga的執(zhí)行過程。源碼有很多刪減,感興趣的可自行查...

    itvincent 評論0 收藏0
  • 淺談Redux(之一):Middleware原理

    摘要:作為目前最火的模式實現(xiàn)之一,它有很多的點值得研究。這個函數(shù)既然要用于,也就是說它接收一個形式為的函數(shù),對其一層層嵌套形式為。這個會在開始時發(fā)起一個,并在這個時發(fā)起另一個成功或失敗的。為了方便起見,會返回這個讓調(diào)用者可以等待。 Redux作為目前最火的Flux模式實現(xiàn)之一,它有很多的點值得研究。今天我們首先來看看它的Middleware。 熟悉Express或者koa的朋友對Middle...

    cocopeak 評論0 收藏0

發(fā)表評論

0條評論

jollywing

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<