首页 > 解决方案 > 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$,observable 模拟了一个返回错误的 http 请求。

当我单击我的saveButton时,行为是:

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

问题是订阅不会保持活跃。

我认为使用catchError, subscription 捕获内部引发的错误会保持活动状态。

关于如何让我的保存点击可观察到的任何想法?

标签: typescriptrxjs

解决方案


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

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

testClick$.pipe(
  retry(),
);

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


推荐阅读