Уроки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 — есть «главный», только он триггерит.
Что нужно сделать
- В
saveClick$.pipe(...)добавьтеwithLatestFrom(role$). - Затем
map(([, role]) => 'Save as ' + role)— первое значение (сам клик) нам не нужно, поэтому пустое место в деструктуризации. - Ожидаемый выход:
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
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...