Я нахожусь в этой ситуации, у меня есть 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 */)
)),
);
Но я не знаю, почему это работает, может кто-нибудь объяснить, почему?