我有一个场景,当发生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中。然而,之后,发送新消息(发布)按钮不会执行另一个帖子,因为不再订阅效果。知道如何优雅地处理这个问题吗?
答案 0 :(得分:2)
基本上有两种方式(可能更多)你可以做什么:
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
的单次运行。
@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的人来说,阅读更似直观。 (但那只是我的个人品味)