В документах Redux есть хороший раздел о том, как асинхронные действия/использование API должны работать в приложении Redux.
http://redux.js.org/docs/advanced/AsyncActions.html
Я следовал этому шаблону, используя промежуточное ПО thunk, и обнаружил, что оно работает очень хорошо. Идея состоит в том, чтобы дать вашим действиям возможность возвращать функцию. У вас будет:
- «Основная» функция, которая будет отправлять информацию о том, что приложение выполняет вызов API, выполняет вызов API и обрабатывает результаты.
- Два чистых создателя действий (функции, которые возвращают объект с типом и любым количеством других свойств), которые будут передавать информацию, связанную с вызовом API, вашим редукторам.
Действия:
/* Inside ./action.js */
/* This is the function you will dispatch from another component (say, a container component. This takes advantage of thunk middleware. */
export function fetchAllInfo() {
return function(dispatch) {
dispatch(requestAllInfo())
/* Import your API function, make sure it takes a callback as an argument */
API.fetchAllInfo((allinfo) => {
dispatch(receiveAllInfo(allinfo))
}
}
/* Pure action creators */
function requestAllInfo() {
return {
type: "REQUEST_ALL_INFO",
}
}
function receiveAllInfo(allinfo) {
return {
type: "RECEIVE_ALL_INFO",
allinfo,
}
}
Редуктор:
/* Inside ./reducer.js */
export function inforeducer(state, action) {
switch(action.type) {
case "REQUEST_ALL_INFO": {
return Object.assign({}, state, {
/* This can be passed as prop so a component knows to show a loader */
isFetching: true,
})
case "RECEIVE_ALL_INFO": {
return Object.assign({}, state, {
isFetching: false,
allInfo: action.allInfo,
})
}
default:
return state
}
}
Таким образом, с промежуточным программным обеспечением thunk (или вашим собственным способом работы с асинхронной диспетчеризацией) и обратным вызовом при каждом вызове API вы можете использовать этот метод для работы с диспетчеризацией вызовов API как в начале вызова, так и при получении результатов.
person
garrettmaring
schedule
28.04.2016