redux applyMiddleware原始碼解讀

2021-07-28 09:54:01 字數 1804 閱讀 8551

前言:

現在閱讀了一下redux的原始碼。下面說說我的理解。

概要原始碼:

為什麼引數是createstore? 我看了createstore的原始碼我就知道了。

我們使用redux的時候是這樣呼叫的

createstore(

rootreducers,

//reducer

preloadedstate,

//enhancer

thunkmiddleware,

createlogger()))

在第一次呼叫createstore的時候,

createstore先判斷是否有middlewares(enhancer)的加入,如果有,就不執行createstore後面的操作,return出去執行enhancer()

注意:執行了 enhancer(createstore)  後,只傳入了兩個引數 (reducer, preloadstate)   ,第三個enhancer 為undefine

step 3:

由於沒有第三個引數enhancer,所以這才是真正執行 createstore(), 返回乙個沒有 middleware 的 store。

step 4:

首先為每乙個middleware以為引數執行一遍,其實是為了給middleware乙個原生的兩個方法的指標。以便在middleware中呼叫。

請看乙個簡單的middleware

const logger =fucntion() }}

呼叫後返回的 chain 是乙個以next為引數的函式陣列。

step 5:

_dispatch = _compose2['

default

這個_compose2是redux的compose方法,

紅框框內的 arguments === store.dispatch, 

因此compose後返回的_dispatch是多個middlewares巢狀而成的函式,每乙個next閉包變數都是裡層的middleware,並且最終的next是store.dispatch

step last:

用新的middleware多層巢狀的_dispatch代替store.dispatch,就over了

結論:

middleware內部的dispatch是原生的沒有middleware時的dispatch,

每乙個middleware都帶有原生的getstate,dispatch和next(下乙個middleware),所以我可以在middleware中不呼叫next,而直接呼叫dispatch,就跳過了後面的middleware了。

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...

Redux原始碼createStore解讀常用方法

const store createstore reducer,preloadedstate enhancer 直接返回當前currentstate,獲取state值,return state 我覺得應該深轉殖乙個新的物件返回,不然有可能會被外部修改 function getstate consol...