我怎么知道Observable是否已经错误或没有错误地完成了?

时间:2018-05-18 10:48:17

标签: javascript rxjs reactive-streams

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

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

如您所见,我正在使用finalize运算符,但我无法知道是否已经错误定型。 doOnComplete中是否有某种doOnErrorrxjs运算符?

3 个答案:

答案 0 :(得分:2)

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