BACK
Уроки30. withLatestFrom: событие плюс актуальное состояние
Уроки · 30

30. withLatestFrom: событие плюс актуальное состояние

Не все источники равноценны

У combineLatest все источники «равные» — любой может вызвать выход. Но часто есть главный источник (клик, событие) и вспомогательные (текущая роль, состояние формы). Хочется реагировать только на главный, но при этом «подглядывать» в актуальные значения вспомогательных.

withLatestFrom — главный + подсказки

main$.pipe(withLatestFrom(extra1$, extra2$)) эмитит только тогда, когда эмитит main$. Дополнительные потоки дают свои последние значения, но сами не запускают эмит.

click$:  ────── click ────── click ──
role$:   admin ──────── user ──────
result$: ────── [click, admin] ── [click, user]

Сравнение

  • combineLatest — все источники равны, любой эмитит → результат.
  • withLatestFrom — есть «главный», только он триггерит.

Что нужно сделать

  1. В saveClick$.pipe(...) добавьте withLatestFrom(role$).
  2. Затем map(([, role]) => 'Save as ' + role) — первое значение (сам клик) нам не нужно, поэтому пустое место в деструктуризации.
  3. Ожидаемый выход: Save as admin.

Детерминированная проверка

В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.

Решение spoiler · click to reveal
const { of, timer, withLatestFrom, map } = Rx;

const saveClick$ = timer(30).pipe(map(() => 'save'));
const role$ = of('admin');

const result$ = saveClick$.pipe(
  withLatestFrom(role$),
  map(([, role]) => 'Save as ' + role)
);
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...