Я провел некоторое исследование о возможных способах сделать это, но я не могу найти тот, который использует ту же архитектуру, что и в приложении, над которым я работаю. Например, React docs говорят, что у нас должен быть метод, который делает HTTP-запрос и затем вызывает действия в разных точках (когда запрос начинается, когда ответ получен и т. Д.). Но у нас есть другой подход. Мы используем действие, которое выполняет HTTP-вызов, а затем отправляет результат. Чтобы быть более точным, мой вариант использования таков:
// action to get resource A
getResourceA () {
return dispatch => {
const result = await axios.get('someLink');
dispatch({
type: GET_RES_A,
payload: result
});
};
}
// another action which needs data from resource A
getSomethingElseByIdFromA (aId) {
return async dispatch => {
const result = await axiosClient.get(`someLink/${aId}`);
dispatch({
type: GET_SOMETHING_BY_ID_FROM_A,
payload: result
});
};
}
Как уже говорилось, для второго действия нужны данные из первого.
Теперь я знаю два способа сделать это:
- вернуть результат первого действия
getResourceA () {
return async dispatch => {
const result = await axios.get('someLink');
dispatch({
type: GET_RES_A,
payload: result
});
return result;
};
}
// and then, when using it, inside a container
async foo () {
const {
// these two props are mapped to the getResourceA and
// getSomethingElseByIdFromA actions
dispatchGetResourceA,
dispatchGetSomethingElseByIdFromA
} = this.props;
const aRes = await dispatchGetResourceA();
// now aRes contains the resource from the server, but it has not
// passed through the redux store yet. It's raw data
dispatchGetSomethingElseByIdFromA(aRes.id);
}
Однако проект, над которым я сейчас работаю, хочет, чтобы данные сначала проходили через хранилище - на случай, если оно должно быть изменено - и только после этого его можно использовать. Это привело меня ко второму способу ведения дел:
- создайте "агрегатную" службу и используйте метод
getState
для доступа к состоянию после завершения действия.
aggregateAction () {
return await (dispatch, getState) => {
await dispatch(getResourceA());
const { aRes } = getState();
dispatch(getSomethingElseByIdFromA(aRes.id));
};
}
А потом просто вызовите это действие в контейнере.
Мне интересно, все ли в порядке со вторым путем? Я чувствую, что нехорошо иметь вещи в магазине редуксов просто ради доступа к ним во время действий. Если это так, что было бы лучше для этой проблемы?