Angular 7 / rxjs-发生catchError后,订阅不会收到更多值

时间:2019-03-08 09:20:21

标签: angular typescript rxjs

假设我有以下代码:

this.service1
  .getValues()
  .pipe(
    mergeMap(response => this.service2.getMoreValues(response.id)),
    catchError(err => of({}))
  )
  .subscribe(response) => {
    console.log(response)
  });

我的问题是:如果调用catchError,则新值不再用于我的订阅。我想做的是:如果调用catchError,则返回类似空对象的内容并正常进行,仍然期望新值来自我的服务。

有人可以告诉为什么在catchError被触发后,订阅不再起作用了吗?谢谢。

2 个答案:

答案 0 :(得分:1)

这是正确的行为。 catchError将订阅其回调返回的Observable。

这意味着,如果希望它继续从Observable源发出值,则可以重新订阅它。

import { concat } from 'rxjs';

const source = this.service1
  .getValues()
  .pipe(
    mergeMap(response => this.service2.getMoreValues(response.id)),
    catchError(err => concat(
      of({}),
      source,
    )),
  );

// Maybe this would work as well, but I didn't test it
// catchError((err, caught) => concat(
//   of({}),
//   caught,
// )),

source.subscribe(response) => {
  console.log(response)
});

最终,retry()运算符会自动为您重新订阅,但是您在重新订阅之前将无法通过of({})

答案 1 :(得分:0)

  

我想做的是:如果调用catchError,则返回类似空对象的内容

尝试像这样在of({})中返回catchError

this.service1
 .getValues()
 .pipe(
   mergeMap(response => this.service2.getMoreValues(response.id)),
   catchError(err => {
     return of({});
   })
 )
 .subscribe(response) => {
   console.log(response)
 });