RxJs顶层Observable报错时是否可不触发switchMap内部订阅
RxJS 错误场景跳过后续switchMap执行方案
你提出的需求完全可以实现,当前代码的问题出在catchError的位置和返回值逻辑上。
问题原因
你当前代码中的catchError位于switchMap上游,且捕获错误后返回了一个正常的通知流,相当于把上游错误转换成了正常发射信号,后续switchMap必然会被触发,不符合你的预期。
最优解决方案
调整操作符的执行顺序,把switchMap放到catchError上游即可:只有上游updateProfile执行成功时才会进入switchMap弹出成功通知,一旦抛出错误会直接跳过switchMap进入catchError处理错误逻辑。
修改后代码如下:
this._profileService.updateProfile(profile).pipe( tap(profile => { this.profile = profile; this.saving = false; this.updateForm(this.profile); }), // 仅上游成功时才会执行,弹出保存成功通知 switchMap(() => this._pjNotificationService.show(PjNotificationType.SAVED, 'Änderungen gespeichert', '', 15000)), // 上游任意阶段抛出错误都会进入此处处理 catchError(error => { console.log(error); this.saving = false; this.updateForm(); return this._pjNotificationService.show(PjNotificationType.ERROR, 'Fehler beim Speichern', `Beim Speichern ist ein Fehler aufgetreten. ${error}`, 15000) }) ).subscribe();
逻辑说明
RxJS流默认遵循错误中断规则:上游抛出未被捕获的错误时,会跳过后续所有普通转换类操作符,直接流入最近的catchError操作符处理。调整顺序后完全匹配你的需求:第一个Observable抛错时,不会订阅switchMap内的成功通知Observable。
备选方案
如果业务逻辑要求必须把catchError放在上游,那么可以在catchError处理完错误通知后返回throwError(() => error),同时在subscribe中添加空的error回调避免全局报错,不过这种写法不如调整操作符顺序清晰易维护。
内容的提问来源于stack exchange,提问作者MarcelSauter
相关产品推荐
相关产品推荐

