Use cases/Route param load — загрузка по id из URL
Use cases · 18 辞
Route param load — загрузка по id из URL
Паттерн
URL — это источник истины. /users/1 должна показать пользователя 1, /users/2 — пользователя 2. Когда меняется id в URL — грузим нового пользователя.
Какую проблему решаем
Пользователь кликает быстро: /users/1 → /users/2. Запрос для id=1 ещё в полёте, когда уже отправлен запрос для id=2. Если медленный ответ id=1 придёт после id=2, на странице окажется не тот пользователь. Императивный subscribe-внутри-subscribe из ActivatedRoute не справится.
Операторы и зачем они нужны
distinctUntilChanged — Router иногда эмитит тот же id повторно. Защищаемся от лишней перезагрузки.
switchMap — при новом id отменяет загрузку старого. Гонка ответов решена.
map — превращает DTO с сервера в page view model.
catchError внутри switchMap — ошибка становится состоянием страницы, а не убивает route stream.
Подводные камни
mergeMap — старый медленный ответ может перерисовать страницу нового id. Классическая ошибка.
concatMap — заставит ждать загрузку для уже неактуальной страницы. Пользователь увидит «застрявший» интерфейс.
catchError снаружи всего pipeline — одна ошибка остановит все будущие переходы по route. Ставьте только внутри switchMap.
Что в итоге получаем
Страница всегда соответствует последнему id в URL. Ошибка — это нормальное состояние страницы, а не сломанная навигация.