我不太了解以下行为:
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
来捕获内部引发的错误将使订阅保持有效。
关于如何使保存的点击保持可见状态的任何想法?
答案 0 :(得分:1)
该行为是正确的。一条链只能发出一个error
通知,该通知使该链被处置(并调用finalize()
处理程序)。
如果您想链接重新订阅,可以使用retry()
运算符,该操作符将自动重新订阅error
通知`。
testClick$.pipe(
retry(),
);
请注意,finalize()
处理程序将被多次调用。