Що таке ReplaySubject?
Продовжимо в тому ж форматі.
Коротко (як на співбесіді)
ReplaySubject - це тип Subject в RxJS, який запам'ятовує кілька останніх значень і відтворює їх новим підписникам.
Кількість збережених значень задається в конструкторі.
Розгорнуто
ReplaySubject - це розширення Subject, яке буферизує попередні значення і при новій підписці програє їх заново.
Приклад:
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 значення.
Конструктор
new ReplaySubject<T>(bufferSize?, windowTime?)Параметри:
bufferSize- скільки значень зберігатиwindowTime- скільки часу зберігати значення
Приклад з часом:
new ReplaySubject(3, 5000)Зберігає:
- максимум 3 значення
- не старші за 5 секунд
Відмінність від BehaviorSubject
| Тип | Зберігає значення | Початкове значення | Новий підписник отримує |
|---|---|---|---|
| Subject | Ні | Ні | нічого |
| BehaviorSubject | 1 | обов'язково | останнє значення |
| ReplaySubject | N | не обов'язково | останні N |
Головна відмінність:
- BehaviorSubject = current state
- ReplaySubject = history
Коли використовують ReplaySubject
Рідше, ніж BehaviorSubject. Наприклад:
- кешування подій
- event history
- логування потоків
- rehydration стану
- event bus
Приклад event-системи:
events$ = new ReplaySubject<AppEvent>(10);Важливий момент (часто запитують)
ReplaySubject може призвести до витоків пам'яті, якщо:
- buffer великий
- потік довгоживучий
- значення важкі
Тому buffer майже завжди обмежують.
Типове follow-up питання
На співбесіді можуть запитати:
Чому BehaviorSubject використовують частіше в Angular?
Відповідь: Тому що Angular-стан зазвичай - це поточне значення, а не історія.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.