我需要在 Observable 完成时执行一些代码,具体取决于是否已完成错误或没有错误。我有这个代码:
const obs = getMyObservable().pipe(finalize(() => {
//here
}));
如您所见,我正在使用finalize
运算符,但我不知道是否已完成是否有错误。rxjs
是否有某种doOnComplete
或doOnError
运营商?
根据 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 个主要管道:
- 在订阅之前更改结果的管道。
- 订阅前不会更改结果的管道。
- 特殊管道。
例如,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')
})