Объекты Subject¶
RxJS Subject является разновидностью объектов Observable. Особенность Subject в том, что он может отправлять данные одновременно множеству "потребителей", которые могут регистрироваться уже в процессе исполнения Subject, в то время как исполнение стандартного Observable осуществляется уникально для каждого его вызова.
Объекты RxJS Subject реализуют принцип работы событий, поддерживая возможность регистрировать неограниченное количество обработчиков отправляемых ими данных.
Рассмотрим пример.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Создание происходит с помощью new Subject(). Далее регистрируются обработчики вызовом метода subscribe(), принимающего подобно обычному Observable три функции: next(), error() и complete().
Но здесь обработчики исполняются не сразу в момент вызова subscribe(), а после обращения к методам next(), error() или complete() самого объекта.
Причем регистрация новых "потребителей" может происходить в любой момент времени. Но получать данные они будут уже начиная со следующей рассылки.
Объекты RxJS Subject по умолчанию являются бесконечно исполняемыми, так как заранее неизвестно, когда будет вызов complete() и будет ли он вызван вообще. Поэтому не стоит забывать про unsubscribe().
В RxJS имеется несколько разновидностей Subject:
BehaviorSubject¶
BehaviorSubject хранит в себе последнее отправленное им значение. Так, каждому новому обработчику в момент регистрации (вызов subscribe()) будет отправлено это значение.
Начальное значение задается в момент создания RxJS BehaviorSubject.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
ReplaySubject¶
В отличие от BehaviorSubject объекты ReplaySubject способны хранить заданное количество последних значений, которое задается при создании объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Все новые "потребители" сразу же получают по очереди все n указанных значений RxJS ReplaySubject.
AsyncSubject¶
В случае с AsyncSubject "потребителям" передается только последнее значение объекта и только, когда он завершит свое выполнение (вызов complete()).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |