BACK
Use casesDashboard load — несколько запросов в один VM
Use cases · 23

Dashboard load — несколько запросов в один VM

Паттерн

Dashboard нужно загрузить из четырёх независимых эндпоинтов: user, profile, permissions, widgets. Они не зависят друг от друга — можно грузить параллельно. Показывать экран только когда ВСЕ четыре ответа пришли.

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

Если просто подписаться на каждый из четырёх — компонент будет рендериться в промежуточных состояниях: «user уже есть, profile ещё null, permissions undefined». На Promise.all можно, но теряются преимущества RxJS — отмена при destroy, единый error boundary, удобная композиция.

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

  • forkJoin — ждёт complete от каждого источника и эмитит ОДИН раз — массив из последних значений. Идеально для HTTP one-shot.
  • map — собирает из четырёх DTO один dashboard view model.
  • catchError — если любой из запросов упал, отдаём fallback VM или error state.

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

  • forkJoin НИКОГДА не эмитит, если хоть один источник не complete. Не подавайте сюда interval, WebSocket или valueChanges без take(1).
  • combineLatest вместо forkJoin — будете получать промежуточные VM по мере приходящих ответов, со половиной полей.
  • catchError снаружи forkJoin — общий fallback на всю загрузку. Если хочется per-request fallback (один сервис упал, остальные есть), ставьте catchError внутри каждого запроса.

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

Компонент получает либо готовый согласованный dashboard VM, либо контролируемую ошибку. Никаких промежуточных «полу-загруженных» состояний.

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