Javascript RXJS捕获外部可观测误差和剩余序列

Javascript RXJS捕获外部可观测误差和剩余序列,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,遇到了一个rxjs问题,我似乎不太明白。基本上,我有两个要求: const obs1$ = this.http.get('route-1') const obs2$ = this.http.get('route-2') 如果obs1$发出错误,我希望捕获它并只发出一个静态值。但是如果obs1$完成,我想切换到obs2$,而不是捕获obs2$中的错误。我让它这样工作: obs1$.pipe( catchError(() => of('my value')), switchMap

遇到了一个rxjs问题,我似乎不太明白。基本上,我有两个要求:

const obs1$ = this.http.get('route-1')
const obs2$ = this.http.get('route-2')
如果
obs1$
发出错误,我希望捕获它并只发出一个静态值。但是如果
obs1$
完成,我想切换到
obs2$
,而不是捕获
obs2$
中的错误。我让它这样工作:

obs1$.pipe(
   catchError(() => of('my value')),
   switchMap((v) => v === 'my value' ? of(v) : obs2$)
).subscribe(
   (v) => console.log(v, 'got my result'),
   (e) => console.log(e, 'got an error')
)

但这似乎有点混乱,我想知道是否有更好的方法来实现这一点。我无法将
catchError
移动到
switchMap
之后,因为这样我也将捕获来自
obs2$
的错误,这是我不想要的。如果我从
obs1$

得到一个错误,我只想跳到结尾。您可以将
catchError
移动到
switchMap
下面,但另外为
obs2$
使用另一个
catchError
,在发生错误时不发出任何东西

obs1$.pipe(
switchMap(()=>obs2$.pipe(
catchError(()=>NEVER)//或'of('someValue')`如果您愿意的话
)),
catchError(()=>of('my value')),
).订阅(
(v) =>console.log(v,‘得到我的结果’),
(e) =>console.log(例如,“出现错误”)
)

我认为这会起作用:

obs1$.pipe(
//快乐路径:`obs1$`已成功完成
concatWith(obs2$),
catchError(()=>of(“静态值”))
)
定义如下:

/`source`在这种情况下指的是`obs1'$`
//`…args`是…[obs2$]
concatAll()(internalFromArray([source,…args],)。订阅(订阅服务器如有);
因此,只有当
obs$1
完成时,才能订阅
obs2$

concatAll()(internalFromArray([source,…args],)
是一种简洁的(粗略地)书写方式:

from([source,…args]).pipe(
concatAll(),
)
现在,
concatAll
被定义为

mergeAll
的有趣之处在于,当内部可观测对象发出错误时,错误通知将被传递到目的地,在这种情况下,错误通知将是
catchError


快速修复 我忘记了关于不应捕获来自
obs2$
的错误的要求:

obs1$.pipe(
concatWith(obs2$),
//‘catch$’指的是错误来自的可观察值
catchError((err,catch$)=>catch$==obs1$?of(“静态值”):throwError(err));
)

你可以让obs1抛出,除非你有一些顾虑,否则它不会执行obs2,但我需要捕捉obs1错误。如果错误对象中的错误消息是唯一的,那么你可能能够区分单个捕捉,那么我马上回到我试图避免的鸭子键入方法。寻找一个解决方案,在这个解决方案中,无论从任何一个可观察到的结果中产生什么错误或值,我都会得到所需的序列。想要移除自身的链感知。可能您当前的方法是最合适的,如果您经常使用此模式,我认为您可以为其创建自定义运算符。谢谢您的回答,但我确实需要抛出obs2错误。Obs1基本上检查是否存在某些内容,如果不存在我想忽略的内容,则抛出一个错误(尽管我仍然需要访问subscribe处理程序)。Obs2将验证该项(如果它存在),我需要这些错误来访问错误处理程序。@bryan60:这是一个有趣的场景。不幸的是,我不能用标准的操作员来提供更清洁的解决方案。感谢您的努力。似乎它应该是可行的,但可能不是,除非我已经有了它。