rxjs是一个JavaScript库,可实现异步和基于事件的程序的创建。主要类型是Observable
,提供了一套功能和运算符,以使与数据通过的数据更容易。该系列将详细介绍这些操作员(以及一些独立功能),并提供其使用的示例。
在这篇文章中,我们将覆盖catchError
操作员。
它有什么作用?
顾名思义,该操作员用于捕获从我们可观察到的错误。这使我们能够为错误添加特殊处理,更重要的是,控制我们的订阅会发生什么。
例子
在这里,我们将使用interval
函数和map
运算符。 interval
功能将为我们提供可观察到的输出增量数字。当值达到10:
时,我们将使用map
操作员丢弃错误
import { catchError, interval, map, of } from 'rxjs';
interval(1000)
.pipe(
map(count => {
if (count === 10) {
throw new Error('Error thrown at count of 10');
}
return count;
}),
catchError((error: Error) => {
return of('Error handled: ' + error.message)
}))
.subscribe(x => {
console.log(x);
});
这为我们提供了输出:
0
1
2
3
4
5
6
7
8
9
Error handled: Error thrown at count of 10
我们将在这一点上看到程序结束。这是由于使用interval
而不是预期行为的怪癖。当订阅interval
结束时,它将停止输出值,默认情况下,错误将结束订阅。
如果我们希望订阅继续下去,该怎么办?好吧,catchError
操作员已涵盖了我们。在上面的示例中,我们将catchError
传递给具有单个参数的函数,错误。可选的第二个参数为我们提供了对最初订阅的可观察的参考。
让我们看到一个例子。我们将为此创建一个可观察的,以避免interval
的怪癖:
import { Observable, Subject, catchError, map } from 'rxjs';
const provider$ = new Subject<number>();
let count = 0;
provider$
.pipe(
map((x) => {
if ((x % 5) === 0) {
throw new Error('Error thrown at multiple of 5');
}
return x;
}),
catchError((error: Error, caught: Observable<number>) => {
console.error('Error handled: ' + error.message);
return caught;
}))
.subscribe(x => {
console.log(x);
});
setInterval(() => {
count++;
provider$.next(count);
}, 1000);
看来这里还有很多事情要做,但是我们刚刚实施了自己的interval
版本。现在,每当我们达到5个倍数时,map
操作员都会丢失错误。重要的更改是在catchError
处理中:
catchError((error: Error, caught: Observable<number>) => {
console.error('Error handled: ' + error.message);
return caught;
}))
我们的错误处理现在为caught
(原始观察值),记录错误并返回caught
。这只会强迫我们的管道重新订阅错误。所以现在我们得到:
1
2
3
4
Error handled: Error thrown at multiple of 5
6
7
8
9
Error handled: Error thrown at multiple of 5
正如我们看到的,每次抛出错误时,我们都会重新订阅并等待下一个值。但是,有几件事要注意这种方法:
-
caught
将与您添加的所有操作员一起返回原始订阅。这可能是您要寻找的东西,但是如果您的管道中有一些错误(就像我们上面的错误一样),那将继续发生 - 如果您使用了
BehaviorSubject
,则重新订阅将尝试重新处理从可观察的可观察到的最后一个值。像第一点一样,如果您重新管道引起了此错误,您将再次发生这种错误。
因此,请记住您可以回来的可观察到的。您不想结束:
Error handled: Error thrown at multiple of 5
Error handled: Error thrown at multiple of 5
Error handled: Error thrown at multiple of 5
Error handled: Error thrown at multiple of 5
Error handled: Error thrown at multiple of 5
Error handled: Error thrown at multiple of 5
因为编程正在反复尝试处理不良价值。
此示例的源代码可在github上获得:https://github.com/drownedintech/rxjs-operators