BACK
Уроки26. exhaustMap: игнорировать, пока заняты
Уроки · 26

26. exhaustMap: игнорировать, пока заняты

exhaustMap — занят, приходите позже

exhaustMap — противоположность switchMap. Он запускает первую внутреннюю задачу и игнорирует все новые внешние значения, пока эта задача не закончится. Когда она завершится — снова готов принять следующее значение.

Главный сценарий

Кнопка Login или Submit. Пользователь занервничал и нажал четыре раза подряд. Мы хотим, чтобы пошёл только один запрос — повторные нажатия игнорируем.

Сравнение со switchMap

switchMap:  «беру последнего» — отменяет старое
exhaustMap: «я занят, отстань» — игнорирует новое

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

  1. В pipe добавьте exhaustMap(value => timer(20).pipe(map(() => 'Processed ' + value))).
  2. Marble симулирует клики 0, 1, 2 близко друг к другу, затем пауза, потом 3.
  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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...