RxJs。如果我有两个 observable,如何抛出错误并继续发出值?

Posted

技术标签:

【中文标题】RxJs。如果我有两个 observable,如何抛出错误并继续发出值?【英文标题】:RxJs. How to throw error and continue emiting values if I have a two observable? 【发布时间】:2021-12-27 04:39:37 【问题描述】:

https://stackblitz.com/edit/rxjs-catcherror-withmapoperators-lwutxg?file=index.ts

const fakeRequest$ = of().pipe(
  tap((_) => console.log('fakeRequest')),
  throwError
);

const iWillContinueListening$ = fromEvent(
  document.getElementById('continued'),
  'click'
).pipe(
  switchMap((_) =>
    fakeRequest$.pipe(
      catchError((_) => 
        return throwError('x');
      )
    )
  )
);

const parent = iWillContinueListening$.pipe(
  catchError((err) => 
    console.log('er', err);
    return of('err');
  )
);



parent.subscribe(console.log);

如何在 iWillContinueListening$ 出错时激活 catchError on parrent 并仍然发出值?

【问题讨论】:

也许retryretryWhen 是您需要的? learnrxjs.io/learn-rxjs/operators/error_handling/retrylearnrxjs.io/learn-rxjs/operators/error_handling/retrywhen 我很难说出你想做什么。当链发出error 通知时,它将终止并且永远不会再有next 排放。也许您正在寻找 retry() 或者甚至是 onErrorResumeNext() 【参考方案1】:

为了查看你想要达到的效果,你的iWillContinueListening$ observable 永远不应该抛出错误。它应该捕获错误并返回一个备用值。

const iWillContinueListening$ = fromEvent(
  document.getElementById('continued'),
  'click'
).pipe(
  switchMap((_) =>
    fakeRequest$.pipe(
      catchError((_) => 
        //return throwError('x'); <--commenting this
        return of('x');  <-- adding this
      )
    )
  )
);

【讨论】:

以上是关于RxJs。如果我有两个 observable,如何抛出错误并继续发出值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular/RxJS 中合并两个 observable?

取消订阅 RxJS Observables

如何在 RxJS 中停止 Observable 的间隔

Rxjs 如何知道 observable 有多少订阅者?

RxJs Observable:如果为空/过滤则执行函数

RxJS:如何将 Observable<Observable<Thing>> 转换为 Observable<Thing[]>