【问题标题】:How to handle errors inside reducers?如何处理减速器内部的错误?
【发布时间】:2017-05-17 15:18:46
【问题描述】:

我有我的 loggerService,我需要捕获 reducer 中的所有错误并通过我的服务将其发送到服务器。

我该怎么做?我知道reducer应该是一个纯函数,但还有什么想法吗?

我需要添加reduser try catch

    case actions.GAMES_LOADED{
       ......
       try{}
       catch(err){
       this.loggerService.error(err);
    }
}

或者也许将一些东西扔进减速器并在某个地方抓住它......

非常感谢

【问题讨论】:

    标签: angular rxjs ngrx


    【解决方案1】:

    简答:你不知道。

    为什么? - reducer 只负责更新 store,它应该执行任何业务逻辑或验证数据 - 到达 store 的任何数据都应该是已经有效,只是被存储/更新/从商店中删除。

    可能的解决方案:您应该在effect 或一些负责获取/创建数据的服务 中执行此类操作。

    【讨论】:

    • 我不需要添加任何业务逻辑或验证数据。我只想添加尝试捕获,如果有任何错误要记录它...只是调用 logger.service.error(error)
    • 那么你必须在 Angular 之外执行此操作 - 此外,reducer 应该以没有错误的方式编写 - 你的 reducer 会抛出什么样的错误?
    • 例如我从服务器得到了一些响应,并且由于某些原因响应缺少对象的属性。发生映射内部减速器错误时,我想处理此类错误并将其发送到日志。
    • 正是这种操作称为“数据验证”,应该在数据服务中接收到数据时直接完成 - 这样做的原因是,如果服务器发送格式错误的数据,服务应防止这些不正确/不完整的数据进入应用程序生命周期。
    • 如果只是向用户显示最近请求(+重试)失败的消息,您应该能够在存储中中继错误状态。此时所有先前显示的数据可能都无效,这也是一个状态
    【解决方案2】:

    我不同意reducer只负责更新store。它负责更新应用程序状态..store 以及 UI 状态。所以在这种情况下,reducer 有责任更新应用程序中的错误状态。在通过某些错误操作reducer从对错误的影响进行重定向时,可以更新错误状态。但是,在这种情况下,同一个 reducer 应该在收到任何成功操作时清除错误状态。但我并不是说这是最佳做法。

    【讨论】:

      【解决方案3】:

      如果您向应用程序状态添加“loadingMessage”项,您可以在此 reducer 中将该状态设置为空或消息。然后,组件可以使用存储选择器读取它,如果不为空,则记录或生成对话框或您希望对该状态执行的任何操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 2018-04-08
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多