我如何知道 Observable 是否最终确定有错误或没有错误



我需要在 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类似,但它属于第一种管道类型,它接受输入,并且必须返回可在下一个管道或最终订阅中使用的输出。

Finalize是一种特殊的管道,其功能与Tap相同,但在订阅后。例如,记录最终结果或在完成后取消订阅是很好的。

CatchError是一个更改结果的管道,但仅当上一步引发错误时才调用它。这用于避免未处理的错误,您应该返回可观察的"默认值"而不是失败的可观察量(因此我们处理错误并且应用程序不会中断)。

如果catchError已启动,您可以猜测您的可观察量何时出现错误,并在它到达订阅之前立即处理它。

如果未启动此管道,则考虑结果时没有错误。

接受的答案是错误的。 为什么?因为无论如何,"最终确定"都会运行。请参阅案例 为什么在 RxJS 中完成完成?. 简而言之,无论是否存在错误,最终确定都将运行。使用变量(可能在闭包中)来找出差异:

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

您可以使用 concat

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

根据文档,仅当第一个成功完成时,才会订阅第二个可观察量

使用 tap/do 运算符,即:

tap({
next: val => {
console.log('on next', val);
},
error: error => {
console.log('on error', error.message);
},
complete: () => console.log('on complete')
})

相关内容