I have a requirement where, once I get a response from my first API call, I need to make 2 API calls (can be in parallel). Once all the API call's response is got, I need to send the observables (obs2$ & obs3$) to the subcomponent.
Code is something like:
ngOnInit(): void { this.obs1$ = this.getData1(); this.obs2$ = this.obs1$.pipe( concatMap(() => { return this.getData2(); }) ); this.obs3$ = this.obs1$.pipe( concatMap(() => { return this.getData3(); }) ); } private getData1(): Observable<string> { return this.service.getData1<string>('/api/get_1').pipe( tap((response: string) => { this.id = response }) ); } private getData2(): Observable<string> { return this.service.getData2<string>('/api/get_2/id='+this.id).pipe( tap((response: string) => { ... this.flag2 = true; }) ); } private getData3(): Observable<string> { return this.service.getData3<string>('/api/get_3/id='+this.id).pipe( tap((response: string) => { ... this.flag3 = true; }) ); } My .html is like this:
<ng-container *ngIf="(data2: obs2$ | async, data3: obs3$ | async) as data; else loading"> <ng-container *ngIf="flag2 && flag3; else loading"> <sub-component [data2]="data.data2" [data3]="data.data3" > <sub-component> </ng-container> </ng-container> <ng-template #loading> Loading... </ng-template> The issue is API call of getData1 is getting called 2 times. Is there a way to have it in single. Also, if I can do it without using the flags (flag 2 & flag3). Note: I tried this, but it did not work:
ngOnInit(): void { this.obs1$ = this.getData1(); this.obs1$.pipe(first()).subscribe(() => { this.obs2$ = this.getData2(); this.obs3$ = this.getData3(); }); }