我直接从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 =>
?
答案 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)
}
迭代中间件的数组,调用每个函数并为每个函数(store =>
param)提供middlewareAPI:
chain = middlewares.map(middleware => middleware(middlewareAPI))
组成中间件数组:
dispatch = compose(... chain)(store.dispatch)
并在compose中将每个中间件作为next =>
参数传递给之前的参数,并将dispatch
传递给最后一个:
return funcs.reduce((a,b)=>(... args)=> a(b(... args)))
现在中间件是一个只有一个参数action =>
的简单函数,每当一个动作传递到中间件链时,每个中间件的action =>
函数都会被当前动作调用。