在rxjs中将管道“观察”多次

时间:2019-10-03 10:58:57

标签: angular rxjs

这是我的情况:我正在由Angular的httpClient发出HTTP请求。

如果发生错误,我希望通过管道将可观察对象捕获到该错误,并将定制的错误返回给订户。即:


let observable = null;

if (sourceType === Source.HTTP) {
  observable = this.http.get("url", options);

  observable.pipe(
    catchError((err: HttpErrorResponse) => {
      const newError = new Error();
      ...
      return throwError(newError);
    })
  );
}
...

但是,我也想对请求设置超时,因此稍后,我打开另一个管道:

// ... code above...

observable.pipe(timeout(2500));

然后,当执行该错误时,第一个管道无法处理该错误,所以我的问题是:第二个管道是否会覆盖第一个管道?在那种情况下,我认为这不应该被称为“管道” ...

2 个答案:

答案 0 :(得分:2)

除非您将其退回或对其执行任何操作,否则它不会做任何事情:

observable.pipe(
    catchError((err: HttpErrorResponse) => {
      const newError = new Error();
      ...
      return throwError(newError);
    })
  );

您缺少平等。我相信这也是您的意图。 Observable是不可变的,无论管道返回什么内容,都应该对其进行存储,返回或订阅以使其正常工作。

observable = observable.pipe(
    catchError((err: HttpErrorResponse) => {
      const newError = new Error();
      ...
      return throwError(newError);
    })
  );

答案 1 :(得分:1)

每次调用pipe时,都会返回新的Observable。 执行顺序只有在您subscribe可以观察到之后才重要。 例子:

const firstObservable$ = of(1);

// firstObservable$.subscribe(console.log) -> '1'


const secondObservable$ = firstObservable$.pipe(delay(3000));

// secondObservable$.subscribe(console.log) -> '1' with a delay of 3000


const thirdObservable$ = firstObservable$.pipe(
  withLatestFrom(of(3)),
  map(data => data[0] + data[1])
);

// thirdObservable$.subscribe(console.log) -> '4' without the delay


const fourth$ = firstObservable$.pipe(
  map(a => a + 2)
).pipe(
  filter(f => f > 1)
).pipe(
  flatMap(num => this.http.get('url' + num))
);

// fourth$.subscribe(console.log) -> The result of http call to 'url3'