Я недавно написал apiMiddleware, так что вот упрощенная версия.Вам нужно получить ошибку при возникновении проблемы с API, а затем отправить сообщение об ошибке { type: errorType }
.Тогда вам нужен редуктор для обработки этих изменений.
export default function createApiMiddleware(axios) {
return ({ getState }) => next => action => {
const api = action[CALL_API]
if (!api) {
return next(action)
}
const obj = {}
const { actionPrefix, types, method, host, url, onSuccess, ...props } = api
const prefix = actionPrefix || ''
const [startedType, successType, errorType] = types ? types : ACTION_KEYS.map(v => prefix + v)
next({ type: startedType })
obj.method = method || 'get'
obj.url = host ? (host + url) : url
const onSuccessOps = Object.assign({}, defaultOnSuccess, onSuccess)
const { responseBody } = onSuccessOps
const afterSuccess = (payload) => {
const { customActions } = onSuccessOps
customActions.forEach(type => {
next({ type, payload })
})
}
return axios(
Object.assign(obj, { ...props })
).then(res => {
const payload = responseBody(res)
next({ type: successType, payload })
afterSuccess(payload)
}, err => {
next({ type: errorType, payload: err })
})
}
}
export default function createApiReducer(actionPrefix, options) {
const ops = Object.assign({}, defaultOptions, options)
const initialState = {
data: [],
isLoaded: false,
isLoading: ops.loadOnStart,
error: null,
}
return (state = initialState, action) => {
const custom = ops.customActions[action.type]
if (custom) {
return custom(state)
}
switch (action.type) {
case `${actionPrefix}Loading`:
return {
...state,
isLoading: true,
error: null
}
case `${actionPrefix}Error`:
return {
...state,
isLoading: false,
error: action.payload
}
case `${actionPrefix}Success`:
return {
...state,
isLoading: false,
isLoaded: true,
error: null,
data: action.payload
}
default:
return state
}
}
}
Поскольку вам требуется промежуточное программное обеспечение, поэтому я привожу его здесь в качестве справочного материала, обычно вы просто хотите отправить пару действий для одного API в любом учебнике с избыточностью.Надеюсь это поможет.