RxJS. Тонкость работы iif

Роль iif заключается не в том, чтобы выполнять один из Observable, а в том, чтобы подписаться на один из 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

Проблема использования оператора заключается в том, что если в качестве результа использовать http запросы, то они оба будут отправлены. Решением будет использовать оператор defer вместо iif.


Похожие записи

RxJs Subjects

Выдержки из доклада Андрея Алексеева (Tinkoff) про RxJs (Subject, Behaviour Subject, Replay Subject, Async Subject). Применение в Angular.

Поисковый запрос с помощью RxJS

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