RXJS操作员:Catherror
#javascript #网络开发人员 #rxjs #typescript

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