Как продолжать получать значения, если внутренняя наблюдаемая не работает в потоке наблюдаемых наблюдаемых? - PullRequest
0 голосов
/ 02 декабря 2018

Я нахожусь в этой ситуации, у меня есть Observable of Observables вроде этого:

 public outerFunction(
    collections: someObject
  ): Observable<someOtherObject> {

    const outerObservable$ = new Observable<Observable<someOtherObject>>(
      (observer) => {

        const collKeys = Object.keys(collections);
        for (const id of collKeys) {
          if (collections[id]) {
            const innerObs$ = this.functionThatReturnsObs(
              collections[id]
            )
            observer.next(innerObs$);
          }
        }
      }
    );
    return outerObservable$.pipe(mergeAll(1));
}

functionThatReturnsObs делает Http-вызов для получения некоторых данных,

Моя проблематот;в случае сбоя одного из вызовов я не получаю никаких других данных от других http-вызовов, как если бы поток был прерван.

Я хотел бы сделать что-то вроде:

this.outerFunction(collections).piep(
map((data) => /* do something with this data*/),
catchError((error) => /* in case of failure of one of the http calls do something */ ));

ОБНОВЛЕНИЕ

Вызов observer.next(innerObs$.pipe(() => empty());, кажется, не работает для меня,

, но мне удалось получить желаемое поведение, вернув Observable<Observable<someOtherObject>> из outerFunction изатем, используя mergeMap, вот так:

  public outerFunction(
    collections: someObject
  ):Observable<Observable<someOtherObject>> {

    const outerObservable$ = new Observable<Observable<someOtherObject>>(
      (observer) => {

        const collKeys = Object.keys(collections);
        for (const id of collKeys) {
          if (collections[id]) {
            const innerObs$ = this.functionThatReturnsObs(
              collections[id]
            )
            observer.next(innerObs$);
          }

        }
      }
    );
      return outerObservable$;
}

и затем:

this.outerFunction(collections).pipe(
mergeMap((innerObs$) => innerObs$.pipe(
map((data) => /* do something with this data*/),
catchError((err) => /* in case of err handle the faild HTTP call */)
)),
);

Но я не знаю, почему это работает, может кто-нибудь объяснить, почему?

1 Ответ

0 голосов
/ 02 декабря 2018

У вас уже была правильная идея использовать catchError.Чтобы не допустить смерти внешней наблюдаемой, просто добавьте ее к внутренней наблюдаемой.Например

observer.next(innerObs$.pipe(catchError(() => EMPTY)));
...