2

我有一个场景,当发生 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 中。但是在那之后,发送新消息(发布)按钮不会再发布另一个帖子,因为不再订阅效果。知道如何优雅地处理这个问题吗?

4

1 回答 1

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 的人来说,阅读它似乎更直观。(但这只是我个人的口味)

于 2017-04-13T18:06:22.103 回答