You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.3 KiB
42 lines
1.3 KiB
import compose from './compose'
|
|
|
|
/**
|
|
* Creates a store enhancer that applies middleware to the dispatch method
|
|
* of the Redux store. This is handy for a variety of tasks, such as expressing
|
|
* asynchronous actions in a concise manner, or logging every action payload.
|
|
*
|
|
* See `redux-thunk` package as an example of the Redux middleware.
|
|
*
|
|
* Because middleware is potentially asynchronous, this should be the first
|
|
* store enhancer in the composition chain.
|
|
*
|
|
* Note that each middleware will be given the `dispatch` and `getState` functions
|
|
* as named arguments.
|
|
*
|
|
* @param {...Function} middlewares The middleware chain to be applied.
|
|
* @returns {Function} A store enhancer applying the middleware.
|
|
*/
|
|
export default function applyMiddleware(...middlewares) {
|
|
return (createStore) => (...args) => {
|
|
const store = createStore(...args)
|
|
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),
|
|
}
|
|
const chain = middlewares.map((middleware) => middleware(middlewareAPI))
|
|
dispatch = compose(...chain)(store.dispatch)
|
|
|
|
return {
|
|
...store,
|
|
dispatch,
|
|
}
|
|
}
|
|
}
|