Skip to main content

Що таке ReplaySubject?

Продовжимо в тому ж форматі.


Коротко (як на співбесіді)

ReplaySubject - це тип Subject в RxJS, який запам'ятовує кілька останніх значень і відтворює їх новим підписникам.

Кількість збережених значень задається в конструкторі.


Розгорнуто

ReplaySubject - це розширення Subject, яке буферизує попередні значення і при новій підписці програє їх заново.

Приклад:

ts
import { ReplaySubject } from 'rxjs'; const subject = new ReplaySubject<number>(2); subject.next(1); subject.next(2); subject.next(3); subject.subscribe(v => console.log(v));

Результат:

2 3

Тому що вказаний буфер 2 значення.


Конструктор

ts
new ReplaySubject<T>(bufferSize?, windowTime?)

Параметри:

  • bufferSize - скільки значень зберігати
  • windowTime - скільки часу зберігати значення

Приклад з часом:

ts
new ReplaySubject(3, 5000)

Зберігає:

  • максимум 3 значення
  • не старші за 5 секунд

Відмінність від BehaviorSubject

ТипЗберігає значенняПочаткове значенняНовий підписник отримує
SubjectНіНінічого
BehaviorSubject1обов'язковоостаннє значення
ReplaySubjectNне обов'язковоостанні N

Головна відмінність:

  • BehaviorSubject = current state
  • ReplaySubject = history

Коли використовують ReplaySubject

Рідше, ніж BehaviorSubject. Наприклад:

  • кешування подій
  • event history
  • логування потоків
  • rehydration стану
  • event bus

Приклад event-системи:

ts
events$ = new ReplaySubject<AppEvent>(10);

Важливий момент (часто запитують)

ReplaySubject може призвести до витоків пам'яті, якщо:

  • buffer великий
  • потік довгоживучий
  • значення важкі

Тому buffer майже завжди обмежують.


Типове follow-up питання

На співбесіді можуть запитати:

Чому BehaviorSubject використовують частіше в Angular?

Відповідь: Тому що Angular-стан зазвичай - це поточне значення, а не історія.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.