Angular Rxjs。出现错误后不要关闭订阅,而是在 Angular 的错误处理程序中记录错误

问题描述 投票:0回答:3

社区。 我有一个问题。当错误发生时,我需要在 Angular 的错误处理程序中记录错误,而不关闭流订阅。

我有以下数据流:

/**DATA Provider Service*/
 getData(settings): Observable<any> {
  return HttpClientGET$(settings).pipe(
/***/
   map(response => transformMethod(response)),
/***/
   tap(convertedData => sendData(convertedData))
 );
}

sendData(data: any): void {
  this.replaySubject.next(data);
}

getConvertedData(): Observable<any> {
  this.replaySubject.asObservable();
}
 /**Parent Component*/

ngOnInit(): void {
 this.changePositionStream$.pipe(
  switchMap((settings) => this.dataService.getData(settings))
).subscribe();
}
/**Child - Data Component*/

ngONInit(): void {
  this.service.getConvertedData().subscribe();
}

问题 - 当错误流不中断或使用

throwError()
时,可以在 Angular 错误处理程序中捕获错误。但是当抛出错误时,订阅将关闭。

如何在不关闭数据订阅的情况下记录错误?

angular rxjs custom-error-handling
3个回答
0
投票

您可以使用 RxJS Materialize 来处理错误并丢弃它们:

export const catchAndDefaultTo = <T, K>(defaultValue?: K): MonoTypeOperatorFunction<T | K> => pipe(
  materialize(),
  map(n => n.kind !== 'C'
    ? new Notification('N', n.value || defaultValue)
    : n
  ),
  dematerialize(),
)

错误通知没有值,因此此处不会设置

n.value
,它将创建下一个通知,而不是设置为
defaultValue
的内容。错误通知现在被“丢弃”,并发送下一个通知,因此它不会关闭流。

我不确定你想要处理流的哪一部分,所以我假设在这里的某个地方:

ngOnInit(): void {
  this.changePositionStream$.pipe(
    switchMap((settings) => this.dataService.getData(settings)),
    catchAndDefaultTo(undefined)
  ).subscribe();
}

我不是 100% 确定具体化的作用,但我认为它可以让您操纵流中的每个通知(下一步、错误和完成)。


0
投票

在一般情况下,你所要求的是不可能的。

根据 Observable 合约,一旦一个 observable 发出了

error
complete
,那么该 observable 就完成了,并且可能永远不会发出任何其他东西(它可以自由地释放任何资源等)。一个 observable 永远不会
error
两次,
complete
两次,或者同时
error
complete
。一次就是全部。

RxJS 确实附带了一套工具来管理错误和重新尝试/重新订阅源可观察数据等。从您在这里写的内容中我们无法知道什么对您有用,但有很多问题/已经回答了如何管理 RxJS 错误。


0
投票

正如 Mrk Sef 所说,您不会遇到多个错误。您可以改为捕获错误:

    throwError(() => 'error')
      .pipe(catchError(err => {
        // handle error
        console.log(err);
        return of(err);
      }))
      .subscribe(res => {
        if (res != 'error') {
          // handle success
          console.log('This happen on on success')
        }
      });
© www.soinside.com 2019 - 2024. All rights reserved.