社区。 我有一个问题。当错误发生时,我需要在 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 错误处理程序中捕获错误。但是当抛出错误时,订阅将关闭。
如何在不关闭数据订阅的情况下记录错误?
您可以使用 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% 确定具体化的作用,但我认为它可以让您操纵流中的每个通知(下一步、错误和完成)。
在一般情况下,你所要求的是不可能的。
根据 Observable 合约,一旦一个 observable 发出了
error
或 complete
,那么该 observable 就完成了,并且可能永远不会发出任何其他东西(它可以自由地释放任何资源等)。一个 observable 永远不会 error
两次,complete
两次,或者同时 error
和 complete
。一次就是全部。
RxJS 确实附带了一套工具来管理错误和重新尝试/重新订阅源可观察数据等。从您在这里写的内容中我们无法知道什么对您有用,但有很多问题/已经回答了如何管理 RxJS 错误。
正如 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')
}
});