前言:
現在閱讀了一下redux的原始碼。下面說說我的理解。
概要原始碼:
為什麼引數是createstore? 我看了createstore的原始碼我就知道了。
我們使用redux的時候是這樣呼叫的
createstore(在第一次呼叫createstore的時候,rootreducers,
//reducer
preloadedstate,
//enhancer
thunkmiddleware,
createlogger()))
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...