Use cases/Dashboard 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, либо контролируемую ошибку. Никаких промежуточных «полу-загруженных» состояний.