Уроки26. exhaustMap: игнорировать, пока заняты
Уроки · 26
26. exhaustMap: игнорировать, пока заняты
exhaustMap — занят, приходите позже
exhaustMap — противоположность switchMap. Он запускает первую внутреннюю задачу и игнорирует все новые внешние значения, пока эта задача не закончится. Когда она завершится — снова готов принять следующее значение.
Главный сценарий
Кнопка Login или Submit. Пользователь занервничал и нажал четыре раза подряд. Мы хотим, чтобы пошёл только один запрос — повторные нажатия игнорируем.
Сравнение со switchMap
switchMap: «беру последнего» — отменяет старое
exhaustMap: «я занят, отстань» — игнорирует новое
Что нужно сделать
- В
pipeдобавьтеexhaustMap(value => timer(20).pipe(map(() => 'Processed ' + value))). - Marble симулирует клики 0, 1, 2 близко друг к другу, затем пауза, потом 3.
- Ожидаемый выход:
Processed 0(первый клик), потомProcessed 3(новый клик после паузы). Клики 1 и 2 игнорируются — мы были «заняты».
Детерминированная проверка
В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.
Решение spoiler · click to reveal
const { timer, exhaustMap, map } = Rx;
const clicks$ = hot('a 5ms b 5ms c 30ms d|', {
a: 0,
b: 1,
c: 2,
d: 3,
});
const result$ = clicks$.pipe(
exhaustMap(value => {
return timer(20).pipe(
map(() => 'Processed ' + value)
);
})
); script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...