返回

RxJs错误处理详解:Rx.error与Rx.complete的奥秘

Android



熟悉RxJS的开发者都知道,error和complete是互斥的。一旦其中一个被触发,观察者和可观察对象的连接就会被中断(以下简称“管道中断”),观察者将永远不会再接收到可观察对象发出的任何通知。

虽然有5个错误处理符,但实际只有3个,更准确来说只有2个。为什么这么说呢?因为第一个错误处理符…

## **Rx.throwError** 

… 只是一个别名,它与`error`别无二致。因此,实际存在的错误处理符只有3个:

- `error`:创建一个错误通知并将其发送给观察者,导致管道中断。
- `complete`:创建一个完成通知并将其发送给观察者,同样导致管道中断。
- `throw`:创建一个错误并将其重新抛出,允许观察者捕获并处理它,不会导致管道中断。

**何时使用error和complete?** 

使用`error`的场景很明显:当发生错误并需要通知观察者时。使用`complete`的场景也不难理解:当操作完成并且没有更多数据要发送时。

**何时使用throw?** 

`throw`的用法略显复杂。它允许开发者捕获并处理错误,而不会中断管道。这在需要在错误发生后继续执行的情况下很有用,例如:

const source = Rx.from([1, 2,3]);

source.pipe(
map(x => {
if (x === 2) {
throw new Error('错误发生!');
}
return x;
}),
catchError(err => {
console.error(err.message);
return Rx.of(4, 5);
})
)
.subscribe(console.log);


**输出:** 

1
错误发生!
4
5


在上面的示例中,`throw`允许我们捕获并处理错误,然后使用`catchError`算子继续执行流,将45发送给观察者。

## **Rx.Observable.throw和Rx.throw的区别** 

乍一看,`Observable.throw`和`throw`似乎很相似。然而,两者之间有一个关键的区别:`Observable.throw`创建一个错误可观察对象,而`throw`创建一个错误通知。

这意味着`Observable.throw`可以与其他可观察对象组合使用,而`throw`只能与单个可观察对象一起使用。例如:

const source1 = Rx.from([1,2,3]);
const source2 = Rx.from([4,5, 6]);

source1.pipe(
concat(Observable.throw('错误发生!')),
catchError(err => {
console.error(err.message);
return source2;
})
)
.subscribe(console.log);


**输出:** 

1
2
3
错误发生!
4
5
6


在上面的示例中,`Observable.throw`用于在`source1`流中发生错误后切换到`source2`流。

## **错误处理最佳实战** 

在实际开发中,处理错误的最佳方式取决于具体情况。以下是一些通用的最佳实战:

- 使用`error`来通知观察者发生了错误,并中断管道。
- 使用`complete`来表示操作已完成,并中断管道。
- 使用`throw`来捕获并处理错误,允许观察者在不中断管道的情况下继续执行。
- 使用`catchError`算子来处理错误并恢复流。
- 使用`retry`算子来重试失败的操作。

通过遵循这些最佳实战,您可以编写健壮且可恢复的RxJS应用程序。





**Rx.error与Rx.complete的奥秘** 

RxJS中,`error`和`complete`是互斥的。一旦触发其中一个,观察者和可观察对象的连接就会中断(以下简称“管道中断”),观察者将永远不会再接收到可观察对象发出的任何通知。

**何种场景下使用error和complete?** 

使用`error`的场景很明显:当发生错误并需要通知观察者时。使用`complete`的场景也不难理解:当操作完成并且没有更多数据要发送时。

**何种场景下使用throw?** 

`throw`的用法略显复杂。它允许开发者捕获并处理错误,而不会中断管道。这在需要在错误发生后继续执行的情况下很有用。

**Rx.Observable.throw和Rx.throw的区别** 

乍一看,`Observable.throw`和`throw`似乎很相似。然而,两者之间有一个关键的区别:`Observable.throw`创建一个错误可观察对象,而`throw`创建一个错误通知。

**错误处理最佳实战** 

在实际开发中,处理错误的最佳方式取决于具体情况。以下是一些通用的最佳实战:

- 使用`error`来通知观察者发生了错误,并中断管道。
- 使用`complete`来表示操作已完成,并中断管道。
- 使用`throw`来捕获并处理错误,允许观察者在不中断管道的情况下继续执行。
- 使用`catchError`算子来处理错误并恢复流。
- 使用`retry`算子来重试失败的操作。

通过遵循这些最佳实战,您可以编写健壮且可恢复的RxJS应用程序。