Тема
Тема — это своего рода мост или прокси, доступный в некоторых реализациях ReactiveX, который действует как наблюдатель и как Observable. Поскольку это наблюдатель, он может подписываться на одно или несколько Observable, а поскольку это Observable, он может пропускать наблюдаемые элементы, повторно испуская их, а также может испускать новые элементы.
Поскольку тема подписывается на Observable, она запустит это Observable для начала испускания элементов (если это Observable «холодное» — то есть если оно ждёт подписки, прежде чем начать испускать элементы). Это может повлиять на то, что результирующая тема станет «горячей» вариантом Observable исходного «холодного» Observable.
См. также
- Использовать или не использовать Subject от блога Дейва Секстона
- Введение в Rx: Subject
- 101 Примеры Rx: ISubject<T> и ISubject<T1,T2>
- RxJava: Углубленный взгляд на Subject Дэвида Карнока
- Использование Subject Денниса Стоянова
Разновидности Subject
Существует четыре разновидности Subject, предназначенные для конкретных случаев использования. Не все из них доступны во всех реализациях, и некоторые реализации используют другие соглашения об именах (например, в RxScala то, что здесь называется «PublishSubject», известно просто как «Subject»):
AsyncSubject
AsyncSubject испускает последнее значение (и только последнее значение), испущенное исходным Observable, и только после того, как исходное Observable завершится. (Если исходное Observable не испускает никаких значений, AsyncSubject также завершается без испускания каких-либо значений.)
Он также испустит это же конечное значение всем последующим наблюдателям. Однако, если исходное Observable завершается с ошибкой, AsyncSubject не будет испускать никаких элементов, а просто передаст уведомление об ошибке от исходного Observable.
См. также
BehaviorSubject
Когда наблюдатель подписывается на BehaviorSubject, он начинает с испускания элемента, последний раз испущенного исходным Observable (или значения по умолчанию, если таковое ещё не было испущено), а затем продолжает испускать любые другие элементы, испущенные позднее исходным Observable.
Однако, если исходное Observable завершается с ошибкой, BehaviorSubject не будет испускать никаких элементов последующим наблюдателям, а просто передаст уведомление об ошибке от исходного Observable.
См. также
PublishSubject
PublishSubject испускает наблюдателю только те элементы, которые испускает исходное Observable после момента подписки.
Обратите внимание, что PublishSubject может начать испускать элементы сразу после создания (если вы не предприняли шагов для предотвращения этого), и поэтому существует риск, что один или несколько элементов могут быть потеряны между временем создания Subject и подпиской наблюдателя на него. Если вам нужно гарантировать доставку всех элементов из исходного Observable, вам нужно либо сформировать это Observable с Create, чтобы вы могли вручную восстановить поведение «холодного» Observable (проверив, что все наблюдатели подписались, прежде чем начать испускать элементы), или переключиться на использование ReplaySubject вместо этого.
Если исходное Observable завершается с ошибкой, PublishSubject не будет испускать никаких элементов последующим наблюдателям, а просто передаст уведомление об ошибке от исходного Observable.
ReplaySubject
ReplaySubject испускает любому наблюдателю все элементы, которые были испущены исходным Observable, независимо от того, когда наблюдатель подписывается.
Также существуют версии ReplaySubject, которые будут удалять старые элементы, как только буфер повтора начнёт превышать определённый размер или когда прошло определённое время с момента первоначального испускания элементов.
Если вы используете ReplaySubject как наблюдатель, будьте осторожны, не вызывайте его метод onNext (или другие on методы) из нескольких потоков, так как это может привести к совпадающим (непоследовательным) вызовам, что нарушает контракт Observable и создаёт неоднозначность в результирующей теме относительно того, какой элемент или уведомление должно быть воспроизведено в первую очередь.
См. также
Информация, специфичная для языка
RxGroovy
Если у вас есть Subject и вы хотите передать его другому агенту, не раскрывая его Subscriber интерфейс, вы можете замаскировать его, вызвав его метод asObservable, который вернёт Subject как чистый Observable.
См. также
- Javadoc:
AsyncSubject - Javadoc:
BehaviorSubject - Javadoc:
PublishSubject - Javadoc:
ReplaySubject
RxJava 1․x
Если у вас есть Subject и вы хотите передать его другому агенту, не раскрывая его Subscriber интерфейс, вы можете замаскировать его, вызвав его метод asObservable, который вернёт Subject как чистый Observable.
См. также
- Javadoc:
AsyncSubject - Javadoc:
BehaviorSubject - Javadoc:
PublishSubject - Javadoc:
ReplaySubject
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/subject.html