(Angular 2/4/5/6) Два (или более) внутренних метода подписки и один внешний метод подписки
Я пытаюсь выяснить, как я вызываю 2 внутренних метода подписки с внешним методом подписки. В общей сложности я хотел бы сделать 3 вызова API, однако 2 вызова API зависят от результатов 1 вызова API.
this.subscription = this.quoteService //1st api call
.get(this.quoteid)
.pipe(
switchMap((q: TradeinQuote) => {
const quote = q["quote"];
//execute code using quote
this.price = quote["price"];
this.retrieveDeviceid = quote["deviceid"];
return this.faultService.get(this.retrieveDeviceid); //2nd api call
}),
).subscribe(
(faultGroup: FaultGroup[]) => {
//execute logic for 2nd api call
});
);
Итак, после того как я получил this.retrieveDeviceid от 1-го вызова API, я хотел бы сделать еще 2 вызова API, один из них на faultService (как показано) и второй на deviceService
E.g. this.deviceService.get(this.retrieveDeviceid)
В настоящее время показанный код обрабатывает только 1 внутреннюю подписку и 1 внешнюю подписку. Чтобы сделать еще одну внутреннюю подписку, нужно ли использовать mergeMap или forkJoin и как мне это сделать? Ценю ваше руководство!
1 ответ
Использование siwtchMap
а также forkJoin
:
this.subscription = this.quoteService.get(this.quoteid).pipe(
switchMap(response => forkJoin(
of(response),
this.faultService.get(response.quote.deviceid),
this.deviceService.get(response.quote.deviceid),
))
).subscribe(([res1, res2, res3]) => { ... });
forkJoin
объединяет результаты холодных наблюдаемых (то есть наблюдаемых, которые больше не излучают значений).
РЕДАКТИРОВАТЬ
Чтобы управлять логикой для одного звонка, вы можете использовать tap
:
this.subscription = this.quoteService.get(this.quoteid).pipe(
tap(response => { /* execute some code with your first HTTP call response */ }),
switchMap(response => forkJoin(
of(response),
this.faultService.get(response.quote.deviceid),
this.deviceService.get(response.quote.deviceid),
))
).subscribe(([res1, res2, res3]) => { ... });