BACK
Уроки21. Поиск: debounceTime + distinctUntilChanged
Уроки · 21

21. Поиск: debounceTime + distinctUntilChanged

Классическая комбинация для поиска

Это первый практический «рецепт» курса. Сама по себе ни одна из двух «защит» не справляется с задачей живого поиска:

  • Без debounceTime запрос полетит на каждую букву.
  • Без distinctUntilChanged повторный набор одного и того же текста (например, после очистки и нового ввода) даст лишний запрос.

Почему такой порядок

Обычно ставят debounceTime раньше distinctUntilChanged. Логика: сначала «успокоить» поток (отсечь промежуточные значения во время быстрого набора), потом уже сравнить стабильное значение с предыдущим стабильным.

input$.pipe(
  debounceTime(30),
  distinctUntilChanged()
)

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

  1. В функции createQuery$ внутри pipe сначала debounceTime(30), через запятую distinctUntilChanged().
  2. Marble симулирует ввод: ang → angular, потом снова angular (дубль, должен быть отброшен), потом rxjs.
  3. Ожидаемый выход: только angular и rxjs.

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

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

Решение spoiler · click to reveal
const { debounceTime, distinctUntilChanged } = Rx;

function createQuery$(input$) {
  return input$.pipe(
    debounceTime(30),
    distinctUntilChanged()
  );
}
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...