const update = (todoId, isDone) => (dispatch) =>
new Promise(function(resolve, reject) {
dispatch({
type: 'SET_SAVING',
saving: true
});
// Function is expected to return a promise
callUpdateApi(todoId, isDone).then(updatedTodo => {
dispatch({
type: 'SET_SAVING',
saving: false
});
resolve(updatedTodo);
}).catch(error => {
// TBD: Handle errors for Redux
reject(error);
})
});
Если ваше callUpdateApi
возвращает обещание, вам не нужно заключать все действие в обещание, просто можно просто вернуть callUpdateApi
.Что касается обработки ошибок, общий способ - установить флаг где-нибудь в вашем состоянии избыточности вместе с флагом saving
, например, чтобы знать, когда произошла ошибка.Затем ваши компоненты будут получать эти флаги и что-то с ними делать
const update = (todoId, isDone) => (dispatch) => {
dispatch({
type: 'SET_SAVING',
saving: true
});
return callUpdateToApi(todoId, isDone).then(updatedTodo => {
dispatch({
type: 'SET_SAVING',
saving: false,
// Do something with your API response
// e.g. update your redux store via a reducer
updatedTodo
});
})
.catch(err => {
// Handle error, for example set a error flag
// in your redux state so your components know an error occured
dispatch({
type: 'SET_SAVING',
saving: false,
error: true
});
});
}
Подключите ваш компонент, чтобы они могли получить доступ к флагам error
и saving
и, например, отобразить ошибку при сбое вызова:
export default connect(
state => ({
error: state.module.error,
saving: state.module.saving
})
)(Component);
// Inside your JSX
{this.props.error && <p>An error occured</p>}