使用ngrx效果优雅地处理错误

时间:2017-04-13 15:28:38

标签: ngrx ngrx-effects

我有一个场景,当发生http端口错误时,效果会被取消订阅,并且不再起作用。例如,

@Effect() newMessages$ : Observable<any> = this.actions$
.ofType(SEND_NEW_MESSAGE_ACTION)
.switchMap(action => this.threadsService.saveNewMessage(action.payload))
.catch(() => Observable.of(new ErrorOccurredAction("Error Ocurred while saving 
message")) );

假设发生错误,它会显示在消息部分的UI中。然而,之后,发送新消息(发布)按钮不会执行另一个帖子,因为不再订阅效果。知道如何优雅地处理这个问题吗?

1 个答案:

答案 0 :(得分:2)

基本上有两种方式(可能更多)你可以做什么:

1。处理switchMap

中的错误
@Effect() newMessages$ = this.actions$
    .ofType(SEND_NEW_MESSAGE_ACTION)
    .switchMap(action => this.threadsService.saveNewMessage(action.payload)
        .catch(() => Observable.of(new ErrorOccurredAction("Error Ocurred while saving message")))
    );

意思是,如果saveNewMessage中存在错误,则不会影响效果,只会影响saveNewMessage的单次运行。

2。重新订阅原始的observable(参见catch-documentation

@Effect() newMessages$ = this.actions$
    .ofType(SEND_NEW_MESSAGE_ACTION)
    .switchMap(action => this.threadsService.saveNewMessage(action.payload))
    .catch((err, orig) => orig.startWith(new ErrorOccurredAction("Error Ocurred while saving message")));

catch这里做了什么,它将返回旧订阅的原始流(基本上是newMessages$的干净版本),以便将订阅切换到最初发出ErrorOccurredAction

这两种解决方案都是技术上有效的解决方案,我个人更喜欢第一种解决方案,因为对于那些不熟悉rxjs-api的人来说,阅读更似直观。 (但那只是我的个人品味)