BACK
Use casesReset on logout — чистим состояние сервиса
Use cases · 42

Reset on logout — чистим состояние сервиса

Паттерн

После logout приложение не должно продолжать получать данные старого пользователя. Все user-specific потоки (интервал обновления нотификаций, WebSocket, кеш профиля) должны остановиться и обнулиться.

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

Если оставить старый интервал работающим, после logout он продолжит дёргать API «как Ada», а на экране уже другой пользователь. Или ещё хуже — anonymous экран показывает приватные данные. Императивный cleanup в обработчике logout легко забыть, особенно когда новых сервисов добавляется много.

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

  • switchMap(login => userStream$) — для каждого login создаёт свежий user-specific stream. Новый login автоматически отменит старый.
  • takeUntil(logout$) — на logout завершает user-specific inner stream.
  • startWith('anonymous') — задаёт начальное состояние ДО первого login.

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

  • mergeMap вместо switchMap — старый user-stream продолжит жить параллельно новому login. Приватные данные одного пользователя попадут другому.
  • Сброс только UI без остановки upstream — поздние ответы старого пользователя всё равно дойдут и могут перезаписать новое состояние.
  • shareReplay-кеши в singleton service надо явно инвалидировать на logout. Без этого они переживут logout.

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

Logout атомарно останавливает приватные потоки и возвращает приложение в anonymous-состояние.

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