Subject
Rocket.Subject
— TypeSubject(::Type{D}; scheduler::H = AsapScheduler())
A Subject is a special type of Observable that allows values to be multicasted to many Observers. Subjects are like EventEmitters. Every Subject is an Observable and an Actor. You can subscribe to a Subject, and you can call next!
to feed values as well as error!
and complete!
.
Note: By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!
, error!
and complete!
calls. Doing so would lead to undefined behaviour. Use safe()
operator to bypass this rule.
See also: SubjectFactory
, ReplaySubject
, BehaviorSubject
, safe
Rocket.SubjectFactory
— TypeSubjectFactory(scheduler::H) where { H <: AbstractScheduler }
A base subject factory that creates an instance of Subject with specified scheduler.
See also: AbstractSubjectFactory
, Subject
Description
Every Subject is an Observable. Given a Subject, you can subscribe to it, providing an Actor, which will start receiving values normally. From the perspective of the Observer, it cannot tell whether the Observable execution is coming from a plain unicast Observable or a Subject.
Internally to the Subject, subscribe does not invoke a new execution that delivers values. It simply registers the given Observer in a list of Observers.
Every Subject is an Actor. It is an object with the methods next!
, error!
, and complete!
. To feed a new value to the Subject, just call next!(subject, theValue)
, and it will be multicasted to the Actors registered to listen to the Subject.
By convention, every actor subscribed to a Subject observable is not allowed to throw exceptions during next!
, error!
and complete!
calls. Doing so would lead to undefined behaviour. Use safe()
operator to bypass this rule.
Examples
In the following example, the BehaviorSubject
is initialized with the value 0 which the first Observer receives when it subscribes. The second Observer receives the value 2 even though it subscribed after the value 2 was sent.
using Rocket
subject = Subject(Int)
subscription1 = subscribe!(subject, logger("1"))
next!(subject, 1)
next!(subject, 2)
subscription2 = subscribe!(subject, logger("2"))
next!(subject, 3)
unsubscribe!(subscription1)
unsubscribe!(subscription2)
// Logs
// [1] Data: 1
// [1] Data: 2
// [1] Data: 3
// [2] Data: 3