RxJs forkJoin:当所有可观察对象都出错或成功时执行
RxJs forkJoin: Execute when all observables have errored or succeeded
假设我有以下代码,其中一个 observable 抛出错误,另一个在延迟后成功:
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
。
自动化你可以做的 catchError
let observables: Observable<String>[] = [
of("string 1").pipe(delay(1000)),
throwError("error")
].map(obs => obs.pipe(catchError(() => EMPTY)));
假设我有以下代码,其中一个 observable 抛出错误,另一个在延迟后成功:
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
。
自动化你可以做的 catchError
let observables: Observable<String>[] = [
of("string 1").pipe(delay(1000)),
throwError("error")
].map(obs => obs.pipe(catchError(() => EMPTY)));