redux-promise
- 如果action是一个promise, 则会等待promise完成,将完成的结果作为action触发,如果action不是一个promise,则判断其payload是否是一个promise,如果是,等待promise完成,然后将其作为payload的值触发。
import { isPlainObject, isString } from 'lodash'
import isPromise from 'is-promise'
export default ({dispatch}) => next => action =>{
if(isFSA(action)){
//如果不是一个标准的action
//如果action是一个promise,则将其resolve的值dispatch,否则,不做任何处理交给下一个中间件
isPromise(action) ? action.then(dispatch) : next(action)
}
return isPromise(action.payload) ?
action.payload
.then(payload => dispatch({...action, payload}))
.catch(error => dispatch({...action, payload: error, error:true})) :
next(action)
}
/**
* 判断一个action是不是标准的flux的action
* @param {*} action
*/
function isFSA(action) {
//action必须是一个平面对象 plan-object
//action。type必须是一个字符串
// action的属性不能包括其他非标准属性 标准属性["type", "paload", "error", "meta"]
return isPlainObject(action)
&&
isString(action.type)
&&
Object.keys(action).every(key => ["type", "paload", "error", "meta"].includes(key))
}