rxjs:除错误外,保持活动订阅

时间:2019-06-20 08:08:50

标签: typescript rxjs

我不太了解以下行为:

let throw$ = Observable.throw(() => "Server error");
let testClick$ = Observable.fromEvent(this.saveButton.nativeElement, 'click')
.pipe(
    switchMap(() => throw$),
    finalize(() => console.log("finalize testClick$"))
);

let okClick$ = testClick$.pipe(
    catchError(() => Observable.of({})),
    finalize(() => console.log("finalize okClick$"))
);

let koClick$ = testClick$.pipe(
    catchError((error) => Observable.of(error)),
    finalize(() => console.log("finalize koClick$"))
);

okClick$.subscribe();
koClick$.subscribe();

您可以看到throw$可以观察到模拟一个返回错误的http请求。

当我点击saveButton时,行为是:

finalize testClick$
finalize okClick$
finalize testClick$
finalize koClick$

问题在于订阅无法保持有效。

我认为使用catchError来捕获内部引发的错误将使订阅保持有效。

关于如何使保存的点击保持可见状态的任何想法?

1 个答案:

答案 0 :(得分:1)

该行为是正确的。一条链只能发出一个error通知,该通知使该链被处置(并调用finalize()处理程序)。

如果您想链接重新订阅,可以使用retry()运算符,该操作符将自动重新订阅error通知`。

testClick$.pipe(
  retry(),
);

请注意,finalize()处理程序将被多次调用。