RxJs forkJoin:当所有可观察器都出错或成功时执行



想象一下,我有以下代码,其中一个可观察到的抛出错误,另一个在延迟后成功:

let observables: Observable<String>[] = [
of("string 1").pipe(delay(1000)),
throwError("error")
];
observables.forEach((observable, i) => {
observable.subscribe(val => {
console.log('success ' + i);
}, error => {
console.log('error ' + i);
})
})
forkJoin(observables).subscribe(res => {
console.log('final success');
}, error => {
console.log('final error');
});

此代码将记录以下内容:

error 1
final error
success 0

在所有可观察性都成功或出错后,我可以使用什么样的运算符或回调来执行一些代码?目标是按以下顺序登录:

error 1
success 0
final error

另一个可以接受的结果是在某个地方发现错误,并记录:

error 1
success 0
final success

我做了一个演示:https://stackblitz.com/edit/typescript-myfstw?file=index.ts

一种方法是捕获错误并关闭流。

而不是throwError("error")将管道连接到它throwError("error").pipe(catchError(() => EMPTY)),然后带有错误的流简单地完成而没有错误/值。如果需要值,请将EMPTY替换为of('valueYouWant')

在原始流中捕捉错误是很重要的,而不是在forkJoin之后的pipe中。

为了自动捕获错误,你可以进行

let observables: Observable<String>[] = [
of("string 1").pipe(delay(1000)),
throwError("error")
].map(obs => obs.pipe(catchError(() => EMPTY)));

相关内容

最新更新