Проблема в том, что функция dispatch
из useReducer
, полученная из Store.js
, вызывается с Promise, возвращением actions.updateRate
в ratesReducer.js
.
Этот параметр dispatch
должен быть объектом со свойством типа (то же самое в редуксе). Одним из способов решения вашей проблемы будет отправка, когда обещание разрешается или отклоняется. В Redux вы можете использовать Thunk, для этого есть библиотека. При этом я опишу, как работает Thunk, чтобы у вас был лучший обзор.
Давайте улучшим базовую диспетчеризацию и передадим ее провайдеру контекста:
export const StoreProvider = props => {
const [state, dispatch] = useReducer(reducer, initialState);
const thunkDispatch = action => {
if (typeof action === "function") {
return action(dispatch);
}
return dispatch(action);
};
return (
<StoreContext.Provider value={{ state, actions, dispatch: thunkDispatch }}>
{props.children}
</StoreContext.Provider>
);
};
Ваши асинхронные действия теперь могут быть функциями, которые принимают диспетчеризацию в качестве параметра.
const updateRate = dispatch => // get dispatch from parameters
loadRates()
.then(response => dispatch({ // add dispatch here
type: types.UPDATE_RATE,
value: response
}))
.catch(reject => dispatch({ // add dispatch here too
type: types.ERROR_UPDATE_RATE,
value: reject
}))
Вот обновленная ручка: https://codesandbox.io/s/3qx982292p.
Посмотрите на redux-thunk, эта проблема не нова, и для нее уже есть много знаний.