//调用
const store = createStore(rootReducer, applyMiddleware(...middlewares));
//createStore
export default function createStore(reducer, preloadedState, enhancer) //若是第二个参数是function,而且没传第三个参数,则将第二个参数赋值给第三个参数,而后将第二个参数设为undefined if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
enhancer = preloadedState
preloadedState = undefined
}
if (typeof enhancer !== 'undefined') {
if (typeof enhancer !== 'function') {
throw new Error('Expected the enhancer to be a function.')
}
//返回一个高阶函数
return enhancer(createStore)(reducer, preloadedState)
}
}
复制代码
经过调用createStore 返回的结果能够解析为javascript
applyMiddleware(...middlewares)(createStore)(reducer, initialState)
复制代码
//调用applyMiddleware,能够传入多个中间件
export default function applyMiddleware(...middlewares) {
return (createStore) => (reducer, initialState, enhancer) => {
var store = createStore(reducer, initialState, enhancer)
var dispatch = store.dispatch
var chain = []
//将state和dispatch所指向的函数绑定到middlewareAPI
var middlewareAPI = {
getState: store.getState,
dispatch: (action) => dispatch(action)
}
//迭代中间件数组,并执行一遍,将middlewareAPI做为最外层的store,并返回一个至关于next函数的数组
chain = middlewares.map(middleware => middleware(middlewareAPI))
//将数组整理成嵌套的函数体,并将store.dispatch传入最内侧的函数的next,并返回通过处理的dispatch
//dispatch是一个函数,是一个嵌套了多层的函数,其最里面调用的是store.dispatch
dispatch = compose(...chain)(store.dispatch)
//返回一个新的store
return {
...store,
dispatch
}
}
}
复制代码
大体看下,其实就是经过一些操做,而后返回一个通过处理的store,dispatchjava
var middlewareAPI = {
getState: store.getState,
dispatch: (action) => dispatch(action)
}
chain = middlewares.map(middleware => middleware(middlewareAPI))
dispatch = compose(...chain)(store.dispatch)
复制代码
export default function compose(...funcs) {
if (funcs.length === 0) {
return arg => arg
}
if (funcs.length === 1) {
return funcs[0]
}
return funcs.reduce((a, b) => (...args) => a(b(...args)))
}
复制代码
这里有必要解释下funcs.reduce((a, b) => (...args) => a(b(...args))) 这一坨作了些什么?redux
reduce 是专门为累加操做设计的,啥意思呢数组
先把funcs.reduce((a, b) => (...args) => a(b(...args))) 翻译一下app
//以redux-saga为例
//看参数,就知道为何定义middlewareAPI对象了
function sagaMiddleware({ getState, dispatch }) {
...
return next => action => {
if (sagaMonitor && sagaMonitor.actionDispatched) {
sagaMonitor.actionDispatched(action)
}
const result = next(action) // hit reducers
channel.put(action)
return result
}
}
复制代码
//模拟三个middleware
function A(next){
return function A1(action){
next(action)
}
}
function B(next){
return function B1(action){
next(action)
}
}
function C(next){
return function C1(action){
next(action)
}
}
复制代码
假设 dispatch = A(B(C(store.dispatch))),开始执行函数
function A1(action){
function B1(action){
return function C1(action){
store.dispatch(action)
}
}
}(action)
复制代码
一个action的执行顺序:A(action) -> B(action) -> C(action) -> store.dispatch(action),先从内到外生成新的func,而后由外向内执行.ui