Немного опоздал на вечеринку, но я обнаружил, что роль iif
не для выполнения одного пути над другим, а для подписки на один Observable или Другой. Тем не менее, он будет выполнять все пути кода, необходимые для получения каждого Observable.
Из этого примера ...
import { iif, of, pipe } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
const source$ = of('Hello');
const obsOne$ = (x) => {console.log(`${x} World`); return of('One')};
const obsTwo$ = (x) => {console.log(`${x}, Goodbye`); return of('Two')};
source$.pipe(
mergeMap(v =>
iif(
() => v === 'Hello',
obsOne$(v),
obsTwo$(v)
))
).subscribe(console.log);
вы получите следующий вывод
Hello World
Hello, Goodbye
One
Это потому, что для получения obsOne$
нужно было напечатать Hello World
. То же самое верно для obsTwo$
(за исключением того, что путь печатает Hello, Goodbye
).
Однако вы заметите, что он печатает только One
, а не Two
. Это потому, что iif
оценивается в true
, таким образом, подписывается на obsOne$
.
Пока ваша троичная работа - я обнаружил, что эта статья объясняет более управляемый RxJS способ достижения желаемого результата довольно приятно: https://rangle.io/blog/rxjs-where-is-the-if-else-operator/