action ---> dispatcher ---> middleware 1 ---> middleware 2 ---> reducersjavascript
var anyMiddleware = function ({ dispatch, getState }) { return function(next) { return function (action) { // your middleware-specific code goes here } } }
函数的第一级获得2个参数 dispatch 和 getState
调用 getState() 获得store中的整个statejava
函数的第二级提供 next 参数
执行next() 执行下一个中间件或者到redux ,这样就能够按顺序执行中间件redux
函数的第三级提供执行的 ancion 参数
根据action 能够执行相应的操做promise
打印日志异步
function logMiddleware ({ dispatch, getState }) { return function(next) { return function (action) { console.log('logMiddleware action received:', action) return next(action) } } }
一个中间件丢弃全部发送的操做
(这个不是很是有用的,但有一点逻辑,它能够选择性地放弃一些action,而经过其余action)ide
function discardMiddleware ({ dispatch, getState }) { return function(next) { return function (action) { console.log('discardMiddleware action received:', action) } } }
异步中间件用于action异步操做函数
var thunkMiddleware = function ({ dispatch, getState }) { // console.log('Enter thunkMiddleware'); return function(next) { // console.log('Function "next" provided:', next); return function (action) { // console.log('Handling action:', action); return typeof action === 'function' ? action(dispatch, getState) : next(action) } } }
异步中间件用于action异步操做fetch
var thunkMiddleware = function ({ dispatch, getState }) { // console.log('Enter thunkMiddleware'); return function(next) { // console.log('Function "next" provided:', next); return function (action) { if (!isFSA(action)) { return isPromise(action) ? action.then(dispatch) : next(action); } return isPromise(action.payload) ? action.payload.then( result => dispatch({ ...action, payload: result }), error => { dispatch({ ...action, payload: error, error: true }); return Promise.reject(error); } ) : next(action); } } }
调用方式url
function action(){ return { type:'ADD_USER', payload:fetch('url') } }