AngularJS / rxjs:订阅时观察不到错误

Posted

技术标签:

【中文标题】AngularJS / rxjs:订阅时观察不到错误【英文标题】:AngularJS / rxjs: Observable not catching error at subscription 【发布时间】:2021-06-17 07:54:52 【问题描述】:

我正在尝试处理 Observable 上的一些自定义错误。

如果我抛出一个新的自定义错误,我想退出订阅。 但无论我尝试什么,它仍然会继续该过程而不会引发任何错误。

我试图退出订阅函数并跳到错误处理程序,但我的以下代码没有按预期工作..

const obs = new Observable((observer) => 
      observer.next();
    ).pipe(
      map(() => 
        return "Some Data";
      ),
      tap(() => 
        if (true)  // Some condition
          return throwError( new Error("Test error") )
        
      ),
      catchError(() => 
        return throwError( new Error("Test error") );
      )
    )

    obs.subscribe((res) => 
      console.log("[OBS]", res); // Actual triggered handler
    , err => 
      console.log("[OBS]", err); // This handler should be actually triggered
    )

【问题讨论】:

【参考方案1】:

@Loop 的答案是对的,但你可以使用iif 运算符与mergeMap 组合来代替map

iif:

在订阅时决定实际订阅哪个 Observable。

iif 接受一个条件函数和两个 Observable。当操作者返回的 Observable 被订阅时,会调用条件函数。根据当时它返回的布尔值,消费者将订阅第一个 Observable(如果条件为真)或第二个(如果条件为假)。条件函数也可能不返回任何内容 - 在这种情况下,条件将被评估为 false,并且第二个 Observable 将被订阅。

所以你可以尝试这样的事情:

   const MyCustomError1 = throwError(new Error("Test error 1"));
   const MyCustomError2 = throwError(new Error("Test error 2"));

    const obs = new Observable(observer => 
      observer.next();
    ).pipe(
      map(() => 
        return "Some Data";
      ),
      mergeMap(v =>
        iif(
          () => /** Condition goes here **/ true,
          /** if true **/ MyCustomError1,
          /** if false **/ of(v)
        )
      ),
      catchError(() => 
        console.log("Error catched");
        return MyCustomError2;
      )
    );

【讨论】:

这很完美!不知道运营商如此依赖错误处理。【参考方案2】:

点击操作符中的返回值没有任何作用,它不会被后续操作中的可观察流使用。 如果您使用地图而不是点击,您应该会看到错误消息。

【讨论】:

我也尝试过使用 map 运算符,但它没有跳转到错误处理程序...它停留在订阅函数中..

以上是关于AngularJS / rxjs:订阅时观察不到错误的主要内容,如果未能解决你的问题,请参考以下文章

Rxjs: 单播和多播

Angular RxJS入门笔记 (Observable可观察对象Subscribe订阅Observer观察者Subscription对象)

使用 takeUntil 和 combineLatest 取消订阅可观察的 rxjs 不起作用

RxJS - 发生错误时观察到的不会完成

假设RxJS将在订阅顺序中触发每个观察者的下一个是否安全?

submitForm 上的 Angular 2 RxJS 可观察取消订阅