一方面,我有一个流可能偶尔会抛出一个错误:
this.behaviorSubject.error(error)
然而,稍后,我想继续流:
this.behaviorSubject.next(anotherValue)
另一方面,我订阅了订阅者behaviorSubject.asObservable()
.
在订阅中,我正在处理值和错误:
.subscribe( ( value ) => { /* ok */ }, ( error ) => { /* some error */ } );
我希望效果与简单onSuccess
和onError
回调相同,onError
每次发生错误时都会调用,并且不会阻止将来onSuccess
调用.我如何使用RXJS做到这一点?
我已经查看了catch但似乎只是为了防止错误被用户调用.
简短的回答:这是不可能的.
如何使用这个: RxJS的基本概念是任何error
or -call complete
基本上会"杀死"一个流.这个概念迫使你"不要随意乱丢错误",而是要正确处理错误和应用程序中的数据流.一个BehaviorSubject
例如通常是指保存数据,但它应该不会被用来还包括检索/创建数据和处理数据的检索过程中可能occure可能出现的错误的过程.
因此,如果您想阅读本书,则应将您的流程分为两部分:
检索/创建数据:一个流,它将运行一次然后完成和/或每当发生时抛出一个错误.检索数据后,它将被发送到商店.
商店(例如,在你的情况下:一堆BehaviorSubjects):只有有效的数据到达商店,这意味着这里没有进行错误处理,依赖商店的所有部分都可以信任它保存正确的商店数据.
作为示例,您的数据流可能如下所示(作为草图):
store.ts
dataStore: BehaviorSubject= new BehaviorSubject (); errorMessage: BehaviorSubject = new BehaviorSubject ();
数据retrieval.ts
fetchDataById(id: string) { httpService.get(`some/rest/endpoint/${id}`) .subscribe(handleData, handleError); } handleData(data: IData) { errorMessage.next(null); dataStore.next(data); } handleError(error: Error) { errorMessage.next(error.message); dataStore.next(null); }
"但这看起来像很多开销......" - 的确如此,它可确保您的应用程序内的数据流清晰易懂,易于测试和维护.还有可以使用的现成商店概念,如ngrx或redux.