BACK
Use casesAsync validation — проверка username/email
Use cases · 11

Async validation — проверка username/email

Паттерн

Пользователь печатает username или email, а сервер отвечает: «свободно» или «уже занято». Это асинхронная валидация — проверка, которая не может пройти локально, нужен сервер.

Какую проблему решаем

Каждое нажатие клавиши — это потенциальный HTTP-запрос. Без защиты вы получите десятки запросов, а медленный ответ для alice может прийти ПОСЛЕ ответа для taken и перетереть актуальное состояние поля. Форма покажет «свободно», хотя в реальности там «занято».

Операторы и зачем они нужны

  • debounceTime — ждём паузу, чтобы не дёргать сервер на каждую букву.
  • distinctUntilChanged — если значение не изменилось, повторно не проверяем.
  • switchMap — новый запрос отменяет старый. Это ключ к защите от гонки ответов.
  • catchError внутри switchMap — ошибка API становится состоянием валидации, а не убивает весь stream valueChanges.
  • map — нормализуем ответ сервера в объект, понятный форме.

Подводные камни

  • mergeMap вместо switchMap — старый медленный ответ перетрёт новый. Гонка вернётся.
  • exhaustMap здесь вреден: пока летит старая проверка, новые значения игнорируются — увидите статус для уже стёртого ввода.
  • catchError снаружи всего pipeline — первая же ошибка завершит весь validation stream, и валидация перестанет работать навсегда.

Что в итоге получаем

Пользователь видит только результат для последнего стабильного значения. Сетевые сбои — это просто ещё одно состояние поля, а не сломанная форма.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...