Use cases/Async 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, и валидация перестанет работать навсегда.
Что в итоге получаем
Пользователь видит только результат для последнего стабильного значения. Сетевые сбои — это просто ещё одно состояние поля, а не сломанная форма.