在一端,我有一个可能偶尔抛出错误的流:

this.behaviorSubject.error(error)

不过,稍后我想继续这条流:

this.behaviorSubject.next(anotherValue)

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

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

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

我希望其效果与简单的onSuccessonError回调相同,每次发生错误时都会调用onError,并且不会阻止以后进行onSuccess次调用.如何使用RXJS实现这一点?

我已经研究了catch,但它似乎只是防止订阅者调用错误.

推荐答案

这是不可能的.

How to work with this: RxJS的基本概念是,任何errorcomplete次调用基本上都会产生一个流.这一概念迫使您不仅要正确处理错误,还要正确处理应用程序中的数据流.例如,BehaviorSubject通常用于保存数据,但是它也应该用于包括检索/创建该数据的过程,并处理在检索数据期间可能发生的错误.

所以如果你想要go by the book,你应该split up your flow into two parts:

  1. Retrieval/creation of the data:一个流,它将运行一次,然后在每次发生错误时完成和/或抛出一个错误.
  2. The store(例如,在您的 case 中:一堆行为子对象):只有有效数据到达存储区,这意味着这里没有进行错误处理,依赖存储区的所有部件都可以信任存储区,它保存了正确的数据.

例如,您的数据流可以如下所示(如草图所示):

store.ts

dataStore: BehaviorSubject<IData> = new BehaviorSubject<IData>();
errorMessage: BehaviorSubject<IErrorMsg> = new BehaviorSubject<IErrorMsg>();

data-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);
}

"But this looks like a lot of overhead..."-是的,但是它确保了应用程序中干净、易于理解的数据流,易于测试和维护.此外,还可以使用现成的store 概念,如ngrxredux.

Typescript相关问答推荐

为什么当类类型与方法参数类型不兼容时,该函数可以接受类类型

contextPaneTitleText类型的参数不能分配给remoteconfig类型的关键参数'""'''

在不更改类型签名的情况下在数组并集上映射文字

在TypeScrip的数组中判断模式类型

为什么T[数字]不也返回UNDEFINED?

是否有一个版本的联合类型递归地使属性只出现在一个可选选项中?

如何使我的函数专门针对联合标记?

<;T扩展布尔值>;

从子类构造函数推断父类泛型类型

如何在Type脚本中动态扩展函数的参数类型?

为什么我在这个重载函数中需要`as any`?

如何将对象数组中的键映射到另一种对象类型的键?

如何键入派生类的实例方法,以便它调用另一个实例方法?

Typescript,如何在通过属性存在过滤后重新分配类型?

react 路由不响应参数

如何在Type脚本中创建一个只接受两个对象之间具有相同值类型的键的接口?

Select 类型的子项

如何使用 Angular 确定给定值是否与应用程序中特定单选按钮的值匹配?

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?

如何使用 runInInjectionContext 中的参数测试功能性路由防护