我需要在完成Observable时执行一些代码,具体取决于是否已经错误或没有完成。我有这段代码:
const obs = getMyObservable().pipe(finalize(() => {
//here
}));
如您所见,我正在使用finalize
运算符,但我无法知道是否已经错误定型。 doOnComplete
中是否有某种doOnError
或rxjs
运算符?
答案 0 :(得分:2)
使用最新的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
类似,但是它属于第一种管道,它需要输入,并且必须返回可在下一个管道或最终订阅中使用的输出。 / p>
Finalise
是一个特殊管道,它与Tap
相同,但是在订阅之后,最好记录最终结果或在订阅完成后取消订阅
CatchError
是更改结果的管道,但仅在上一步引发错误时才调用。这用于避免未处理的错误,您应该返回一个可观察的“默认值”,而不是失败的可观察的值(因此,我们将处理该错误,并且应用程序不会中断)。
如果 catchError 已启动,您可以猜测可观察对象何时发生错误,并在到达订阅之前立即对其进行处理。
如果未启动此管道,则认为结果没有错误。
答案 1 :(得分:0)
您可以使用concat
concat(
yourObservable(),
defer(() => {
// do something on success
return of('success');
})
)
根据documentation,仅在第一次成功完成后,第二个可观察对象才会被订阅
答案 2 :(得分:0)
接受的答案是错误的。为什么?因为无论如何'finalize'都会运行。见案例Why is finalize lifted in RxJS?。简而言之,无论是否有错误,finalize 都会运行。使用变量(可能在闭包中)找出差异:
let failed = false
source$.pipe(
map(doSomethingFn),
map(doAnotherThingFn),
catchError(e => {failed = true; return throwError(e)}),
finalize(() => {if(!failed)IwontRunIfErrorFn})
)