redux:applyMiddleware源码解读

前言:redux

  笔者以前也有一篇关于applyMiddleware的总结。是applyMiddleware的浅析。数组

  如今阅读了一下redux的源码。下面说说个人理解。闭包

概要源码:app

  

step 1:函数

   applyMiddleware(thunkMiddleware, createLogger()) spa

  第一次执行applyMiddleware增长两个中间件;使用闭包保存中间件;而后返回一个函数(一开始我奇怪了为何参数是createStore???)  指针

step 2:code

  为何参数是createStore? 我看了createStore的源码我就知道了。中间件

  

  咱们使用redux的时候是这样调用的blog

createStore(
    rootReducers,    //reducer
    preloadedState,
    applyMiddleware( //enhancer
        thunkMiddleware,
        createLogger()
    )
)

  在第一次调用createStore的时候,

  createStore先判断是否有middlewares(enhancer)的加入,若是有,就不执行createStore后面的操做,return出去执行enhancer()

  注意:执行了  enhancer(createStore)  后,只传入了两个参数  (reducer, preloadState)   ,第三个enhancer 为undefine

step 3:

  执行 enhancer 就要回过头看applyMiddleware源码。

  因为没有第三个参数enhancer,因此这才是真正执行 createStore(), 返回一个没有 middleware 的 store。

step 4:

  首先为每个middleware以{getState,dispatch}为参数执行一遍,实际上是为了给middleware一个原生的{getState,dispatch}两个方法的指针。以便在middleware中调用。

  请看一个简单的middleware

    const logger = fucntion({getState, dispatch}) {
        return function(next) {
            return function(action){
              console.log('dispatching', action)
              let result = next(action)
              console.log('next state', getState())
              return result
            }
        }
    }

  调用后返回的 chain 是一个以next为参数的函数数组。

step 5:

   _dispatch = _compose2['default'].apply(undefined, chain)(store.dispatch)  

  这个_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了。

相关文章
相关标签/搜索