如何以可维护的方式使用React和Redux thunk处理服务器/连接异常
How to handle server/connection exceptions with React and Redux thunk in a maintainable manner
我使用Redux thunk来调度异步操作,如获取和发布到服务器。每个动作创建者调用都返回一个promise,当ajax完成了它的魔力,并且Redux实际上已经根据ajax的成功/失败调度了正确的动作来更新状态时,这个promise就会解析。通过这种方式,我们可以在组件级别自定义调度后回调。
doPostActionCreator(data) {
return dispatch => {
return httpService.post(data) {
.then(response => {
dispatch({type: POST_SUCCESS, data: response})
return response
})
.catch(error => {
dispatch({type: POST_ERROR})
return error
)}
}
}
}
--
componentsDoPostHandler(data) {
this.props.doPostActionCreator(data)
.catch(error => {
alert(error)
this.setState({...})
})
}
这个简单的例子一切都很好,但当我试图通过这种模式引入真正的错误处理逻辑时,比如从catch中递归调用componentsDoPostHandler,并在计数器限制超过时中断,事情开始看起来很糟糕,很难维护,也很容易中断。更复杂的是,在我的现实世界场景中,this.props.doPostActionCreator
实际上是fetchCsrfTokenActionCreator
的回调,它本身需要相同的错误处理逻辑,尝试获取X次,如果失败,则执行其他操作。现在,如果一个页面包含两个不同的容器,并且它们都引入了这种逻辑,那么在第一个容器已经执行了恢复之后,就不可能取消后者的恢复操作了,因为一旦调用了操作创建者,就无法取消。最后,很难理解程序是如何工作的,"不同步"的操作问题开始出现,使应用程序处于不一致的状态,这些问题很难跟踪。
这让我怀疑,从动作创建者那里返回承诺是否真的是一种反模式,最终导致无法维护的代码。我没有找到任何真实世界中如何使用React/Redux堆栈处理异步服务错误的例子。我做错了吗?有没有一种更干净的方法来处理异步异常(理想情况下尝试X次,提醒用户并返回登录页面),保持一切一致、易于理解、维护并避免异步混乱?
任何关于该主题的真实世界的例子都将受到高度赞赏
我相信您可以在操作创建者内部处理所有重试逻辑。也就是说,我认为您不需要返回任何内容来尝试从组件调用.catch()
,或者无论您在哪里调用动作创建者。记住,你也可以访问thunk中的getState()
方法,比如说在你的动作创建者的.post().catch()
中,你总是可以调度一些东西来指示某个东西失败了,这可能会由一个跟踪失败次数的reducer来处理,然后在调度之后调用.getState()
,查看有多少失败,并决定从那里做什么(即重试,或者可能调度另一个操作,指示某个操作失败了太多次,这将更新您的状态并允许您的组件从该状态呈现)。
我认为,除了动作创作者之外,不必担心.catch()
,你会简化你所看到的问题。如果您希望它出现在多个操作创建者中,您也许可以将其抽象为API调用方方法,该方法为您处理此逻辑。
- 可以't让我的if语句处理js中的html表单输入
- keyup事件处理程序更改焦点不适用于快速键入
- 如何使用jquery处理php循环通过元素
- angular.js没有'无法在PhoneGap中处理视图标记
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 提示使用服务器端事件处理程序激活JavaScript
- javascript:如何在antlr生成的Lexer中进行错误处理
- 如何编写一个具有公共标头的批处理
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 如何处理node.js节点mongodb中的连接和查询队列
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何处理10页以上的静态页眉/页脚
- 将事件处理程序绑定到任何可能的事件
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- python到“;流“;字典处理
- 使用javascript进行实时图像处理
- 导入jQuery脚本获胜'我不处理html文件
- Javascript无法处理表单提交
- 如何使用Redux Thunk处理fetch()响应中的错误
- 如何以可维护的方式使用React和Redux thunk处理服务器/连接异常