Redux中间件,thunk?

时间:2017-01-19 15:32:30

标签: javascript redux

我直接从Redux文档中获取了这些内容:

const logger = store => next => action => {
  console.group(action.type)
  console.info('dispatching', action)
  let result = next(action)
  console.log('next state', store.getState())
  console.groupEnd(action.type)
  return result
}

现在,我知道如何使用承诺,但是雷声......我有点迷失。

为什么他们会执行以下操作:store => next => action =>

1 个答案:

答案 0 :(得分:5)

在关于middleware的redux文档中,您可以看到ES6箭头功能链:

logger = store => next => action =>
转换为ES5后,

看起来像这样:

function logger(store) { // this is not the store, just an object with getState and dispatch
  return function wrapDispatchToAddLogging(next) {
    return function dispatchAndLog(action) {
      console.log('dispatching', action)
      let result = next(action)
      console.log('next state', store.getState())
      return result
    }
  }
}

为什么我们需要一个返回函数的函数:

这称为部分应用程序,您可以在此article中详细了解它。

基本思想是,如果你需要为一个函数提供3个参数,但是你现在只有1个参数,1个稍后,而第3个将在远期,你可以应用参数只要有空,就可以订购,而不是一次。每次应用参数时,都会得到一个新函数,该函数具有参数" stored"在它的背景下。

在Redux中

中间件需要部分应用,因为创建middleware's chain时有几个步骤:

注意:这是实际的"商店"传递给第一个参数:

const middlewareAPI = {
  getState: store.getState,
  dispatch: (action) => dispatch(action)
}
  1. 迭代中间件的数组,调用每个函数并为每个函数(store => param)提供middlewareAPI:

    chain = middlewares.map(middleware => middleware(middlewareAPI))

  2. 组成中间件数组:

    dispatch = compose(... chain)(store.dispatch)

  3. 并在compose中将每个中间件作为next =>参数传递给之前的参数,并将dispatch传递给最后一个:

    return funcs.reduce((a,b)=>(... args)=> a(b(... args)))

  4. 现在中间件是一个只有一个参数action =>的简单函数,每当一个动作传递到中间件链时,每个中间件的action =>函数都会被当前动作调用。