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);