(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]) => { ... });
Другие вопросы по тегам