首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RXJS捕获外部可观测错误和剩余序列

RXJS捕获外部可观测错误和剩余序列
EN

Stack Overflow用户
提问于 2021-02-26 06:19:55
回答 2查看 178关注 0票数 2

遇到了一个我似乎不太理解的rxjs问题。基本上我有两个请求:

代码语言:javascript
复制
const obs1$ = this.http.get('route-1')
const obs2$ = this.http.get('route-2')

如果obs1$发出一个错误,我希望捕获它并只发出一个静态值。但是如果obs1$完成了,我想切换到obs2$,而不是从obs2$捕获错误。我让它像这样工作:

代码语言:javascript
复制
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')
)

但这看起来有点混乱,我想知道是否有更好的方法来实现这一点。我不能在switchMap之后移动catchError,因为这样我也会从obs2$捕获错误,这是我不想要的。如果从obs1$收到错误,我只想跳到结尾

EN

回答 2

Stack Overflow用户

发布于 2021-02-26 16:57:36

您可以将catchError移到switchMap下面,但另外使用另一个catchErrorobs2$在出错时不发出任何内容。

代码语言:javascript
复制
obs1$.pipe(
  switchMap(() => obs2$.pipe(
    catchError(() => NEVER)       // or `of('someValue')` if you wish  
  )),
  catchError(() => of('my value')),
).subscribe(
   (v) => console.log(v, 'got my result'),
   (e) => console.log(e, 'got an error')
)
票数 1
EN

Stack Overflow用户

发布于 2021-02-27 03:20:21

我认为这是可行的:

代码语言:javascript
复制
obs1$.pipe(
  // the happy path: `obs1$` completed successfully
  concatWith(obs2$),
  catchError(() => of("static value"))
)

concatWith定义为:

代码语言:javascript
复制
// `source` in this cases refers to `obs1$`
// `...args` is ...[obs2$]
concatAll()(internalFromArray([source, ...args],  )).subscribe(subscriber as any);

因此,只有在obs$1完成的情况下,才能订阅obs2$

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

代码语言:javascript
复制
from([source, ...args]).pipe(
  concatAll(),
)

现在,concatAll被定义为return mergeMap(identity, concurrent);

关于mergeAll的有趣之处在于,当内部可观察对象发出错误时,错误通知将被传递到目的地,在本例中它将是catchError

快速修复

我忘记了不应该捕获来自obs2$的错误的要求:

代码语言:javascript
复制
obs1$.pipe(
  concatWith(obs2$),

  // `caught$` refers to the observable which the errors comes from
  catchError((err, caught$) => caught$ === obs1$ ? of("static value") : throwError(err));
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66377327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档