什么应该是管理Redux-Thunk异步请求的最佳方法。就像我在服务器上发布一些数据一样,连接组件会检查错误
方法1:我只是回归新的承诺……
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 。至于错误处理,常见的方法是在redux状态的某处设置一个标志 saving 例如,标记以确定何时发生错误。然后,您的组件将接收这些标志并对其执行某些操作
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 标志,例如,当您的呼叫失败时显示错误:
error
export default connect( state => ({ error: state.module.error, saving: state.module.saving }) )(Component);
// Inside your JSX {this.props.error && <p>An error occured</p>}
我们使用的最佳实践是每个thunk动作调度3个动作:
callUpdateApi 是一个承诺然后只是在你的thunk返回它像这样:
const update = (params) => (dispatch) => { dispatch(started()) return callUpdateApi(params) .then(result => dispatch(succeeded(result))) .catch(error => dispatch(failed(error))) }
在减速机内你可以切换 saving 标志为已开始设置为 true 并为成功或失败设置它 false 而已。
true
false