我如何知道 Observable 是否已完成有错误或没有错误?

Héc*_*tor 10 javascript rxjs reactive-streams

我需要在 Observable 完成时执行一些代码,具体取决于是否最终确定有错误。我有这个代码:

const obs = getMyObservable().pipe(finalize(() => {
    //here
}));
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在使用finalize运算符,但我不知道是否已最终确定是否有错误。中是否有某种doOnCompletedoOnError运算符rxjs

Ign*_*tos 9

根据https://www.learnrxjs.io/

使用最新的 RXJS,您可以使用这 3 个运算符

const obs = getMyObservable().pipe(                                       // Let's assume 'obs' returns an array
    tap(() => console.log('Action performed before any other')),
    catchError(() => { console.error('Error emitted'); return of([]); }), // We return [] instead
    finalize(() => console.log('Action to be executed always'))           // Either Error or Success
);
obs.subscribe(data => console.log(data));  // After everything, we log the output.
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你

基于 JoniJnm 评论的编辑

更具体地说,有3个主要管道:

  1. 在订阅之前确实改变结果的管道。
  2. 订阅前不改变结果的管道。
  3. 特殊管道。

Tap 例如来自第二种类型,它可以从 observable 或先前的管道中获取输入并对其进行任何操作,但不能更改下一步的管道结果。

Map 类似,但它属于第一种类型的管道,它需要一个输入,并且必须返回一个可以在下一个管道或最终订阅中使用的输出。

Finalize是一个特殊的管道,它的作用与Tap订阅后相同。例如,记录最终结果或在完成后取消订阅是很好的。

CatchError是一个改变结果的管道,但只有在上一步抛出错误时才会调用它。这用于避免未处理的错误,您应该返回一个可观察的“默认值”而不是失败的可观察对象(因此我们处理错误并且应用程序不会中断)。

如果catchError已经启动,你可以猜测你的 observable 何时发生错误,并在它到达订阅之前立即处理它。

如果未启动此管道,则认为结果没有错误。