'piping' наблюдаемое несколько раз в rxjs - PullRequest
0 голосов
/ 03 октября 2019

Это моя ситуация: я делаю HTTP-запрос от Angular's httpClient.

В случае ошибки, я хочу направить наблюдаемое, чтобы перехватить эту ошибку и вернуть настроенную ошибку подписчикам. т.е.:


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 ]

2 голосов
/ 03 октября 2019

Это ничего не даст, если вы не вернете или не сделаете что-то с этим:

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 голос
/ 03 октября 2019

Каждый раз, когда вызывается pipe, возвращается новая наблюдаемая. Порядок выполнения имеет значение только после того, как вы 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'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...