我怎么知道 Observable 是有错误还是没有错误完成?

How can I know if Observable has finalized with error or without error?

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

const obs = getMyObservable().pipe(finalize(() => {
    //here
}));

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

根据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.

希望对您有所帮助

根据 JoniJnm 评论进行编辑

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

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

Tap 例如来自第二种类型,它可以从可观察的或以前的管道中获取输入并对它做任何事情但不能改变结果下一步的管道。

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

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

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

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

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

你可以使用 concat

concat(
 yourObservable(),
 defer(() => {
  // do something on success
  return of('success');
 })
)

根据documentation,第二个可观察对象只有在第一个成功完成后才会被订阅

接受的答案是错误的。为什么?因为无论如何 'finalize' 都会 运行。参见案例 。总之finalize会运行不管有没有错误。使用变量(可能在闭包中)找出差异:

let failed = false
source$.pipe(
   map(doSomethingFn),
   map(doAnotherThingFn),
   catchError(e => {failed = true; return throwError(e)}),
   finalize(() => {if(!failed)IwontRunIfErrorFn})
)