当前位置:  开发笔记 > 编程语言 > 正文

如何在行为主题上抛出错误并继续流?

如何解决《如何在行为主题上抛出错误并继续流?》经验,为你挑选了1个好方法。

一方面,我有一个流可能偶尔会抛出一个错误:

this.behaviorSubject.error(error)

然而,稍后,我想继续流:

this.behaviorSubject.next(anotherValue)

另一方面,我订阅了订阅者behaviorSubject.asObservable().

在订阅中,我正在处理值和错误:

.subscribe( 
   ( value ) =>  {  /* ok */ },
   ( error ) =>  {  /* some error */ }
);

我希望效果与简单onSuccessonError回调相同,onError每次发生错误时都会调用,并且不会阻止将来onSuccess调用.我如何使用RXJS做到这一点?

我已经查看了catch但似乎只是为了防止错误被用户调用.



1> olsn..:

简短的回答:这是不可能的.

如何使用这个: RxJS的基本概念是任何erroror -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.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有