Sobes.tech
Middle

Exercițiu RxJS: există un Observable la care se abonează de trei ori în șablon. Cum se face o singură abonare în loc de trei, fără a folosi direct pipe-ul async? În ce diferență sunt Subject și BehaviorSubject față de un Observable obișnuit (flux cald vs rece)?

sobes.tech AI

Răspuns de la AI

Если в шаблоне Angular трижды подписываются на один и тот же Observable, это может привести к тройному выполнению источника данных, что неэффективно. Чтобы сделать одну подписку вместо трёх, можно использовать оператор shareReplay или создать Subject/BehaviorSubject, который будет мультикастить значения.

Пример с shareReplay:

const source$ = this.http.get('/api/data').pipe(
  shareReplay(1) // кэширует последний эмит и делится им с подписчиками
);

Теперь несколько подписчиков получат одно и то же значение без повторных запросов.

Если не использовать async pipe, можно подписаться один раз в компоненте и передавать данные в шаблон через переменную.


Отличия Subject и BehaviorSubject от обычного Observable:

  • Observable — холодный поток: источник данных запускается заново для каждого подписчика.
  • Subject — горячий поток: мультикастит значения всем подписчикам, источник запускается один раз.
  • BehaviorSubject — это Subject с хранением текущего значения. При подписке сразу отдаёт последнее значение, даже если подписчик пришёл позже.

Таким образом, Subject и BehaviorSubject позволяют разделять один источник данных между несколькими подписчиками без повторного запуска источника.