Ответ 1
Когда действие достигнет редуктора, это факт. Он отражает то, что уже произошло. Нет смысла спрашивать "имеет ли другой редуктор это действие?" потому что редукторы должны быть пассивными и, в общем, не знать о существовании друг друга. Они должны стремиться быть независимыми, где это возможно.
Нет никакого "истинного" способа выполнить то, что вы хотели, но так как вы уже используете соглашение об обработке любого объекта с свойством error
как глобальную ошибку, вы можете также ввести другое соглашение, например: "если действие имеет флаг suppressGlobalErrorNotification
, тогда глобальный редуктор ошибок не должен заботиться об этом".
// utilities
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response
} else {
const error = new Error(response.statusText)
error.response = response
throw error
}
}
function parseJSON(response) {
return response.json()
}
export function post(url, data) {
const options = {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
}
return fetch(url, options)
.then(checkStatus)
.then(parseJSON)
}
// action creators
import { post } from './utils'
export function submitForm(data) {
return dispatch => post('/myform', data).then(
response => dispatch({
type: 'SUBMIT_FORM_SUCCESS',
payload: response
}),
error => dispatch({
type: 'SUBMIT_FORM_FAILURE',
error: error,
suppressGlobalErrorNotification: (
error.response &&
error.response.status === 400
)
})
)
}
// reducers
export function error(state = null, action) {
if (!action.error || action.suppressGlobalErrorNotification) {
return state
}
if (action.type === 'RESET_ERROR') {
return null
}
return action.error
}
export function form(state = {}, action) {
switch (action.type) {
case 'SUBMIT_FORM_FAILURE':
return Object.assign({}, state, { isFormError: true })
// ...
default:
return state
}
}