(Angular 2/4/5/6) Два (или более) внутренних метода подписки и один внешний метод подписки - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь выяснить, как мне вызвать 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 Ответ

0 голосов
/ 14 января 2019

Используйте 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 объединяет результаты холодных наблюдаемых (то есть наблюдаемых, которые больше не излучают значений).

EDIT

Чтобы управлять некоторой логикой для одного вызова, вы можете использовать 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]) => { ... });
...