Angular RxJs последовательность потоков

Есть 4 сервиса. $service1, $service2, $service3, $service4. Необходимо проверить ответ первого, и если там выполняется условие то вызывать второй сервис и всегда надо вызывать 3 и 4 сервис.

$service1.pipe(
   switchMap(result1 => {
      this.answer1 = result1;
      // вот тут надо по условию вызывать или не вызывать $service2 в зависимости от result1
      return forkJoin([$service3, $service4])
   })
).subscribe(([result3, result4]) => {
   this.answer3 = result3;
   this.answer4 = result4;
})

Не могу понять как правильно сделать цепочку вызовов.


Ответы (2 шт):

Автор решения: Lukas

Реализовал вот так:

$service1.pipe(
   switchMap(result1 => {
      this.answer1 = result1;
      return  result1.test === "yes" ? $service2 : of(result1)
   }),
   switchMap(result2 => {
      if (this.answer1.test === "yes") {
       // тут записал в локальные переменные
      }
      return forkJoin([$service3, $service4])
   })
).subscribe(([result3, result4]) => {
   this.answer3 = result3;
   this.answer4 = result4;
})
→ Ссылка
Автор решения: Sergey Glazirin

Если в вашем случае результат service2 не нужен для проверки разных условий, то можно его вызов убрать в функцию tap. В данной реализации не будет происходить ожидание ответа от service2.

P.S. использовать subscribe внутри pipe() не очень хорошо с точки зрения качества кода (можно вынести в функцию).

import { of, switchMap, forkJoin, tap } from 'rxjs';

const service1$ = of(1);
const service2$ = of(2);
const service3$ = of(3);
const service4$ = of(4);

service1$
  .pipe(
     tap((result) => {
       if (result === 1) {
        service2$.subscribe();
      }
    }),
     switchMap(() => forkJoin([service3$, service4$]))
  )
  .subscribe(console.log);
→ Ссылка