If it is TS code, it is easy to understand.
enhancer forced to be gaudy. Look at the processing of enhancer in createStore, recursively createStore and then filter out the enhancer parameter. y not separate the logical implementation of createStore and Store?
// applyMiddleware: (middlewares) => enhancer
// enhancer: createStore => (reducer, preloadedState) => Store
export default function applyMiddleware(...middlewares) {
// createStore: (reducer, preloadedState, enhancer) => Store
return createStore => (...args) => {
const store = createStore(...args)
// 设置dispatch默认值。不允许在middleware执行的时候调用dispatch。一个中间件不允许有这种权利。
let dispatch = () => {
throw new Error(
'Dispatching while constructing your middleware is not allowed. ' +
'Other middleware would not be applied to this dispatch.'
)
}
const middlewareAPI = {
getState: store.getState,
dispatch: (...args) => dispatch(...args)
}
// 给每个中间件传入middlewareAPI
// 得到chain: Array<(dispatch) => (action) => any>
const chain = middlewares.map(middleware => middleware(middlewareAPI))
// compose chain然后传入dispatch,返回dispatch: (action) => any
dispatch = compose(...chain)(store.dispatch)
// 返回加强后的store
return {
...store,
dispatch
}
}
}