Subject
- Sends only upcoming values;
- A Subject doesn't hold a value;
An RxJS Subject is an Observable that allows values to be multicasted to many Observers.
var subject = new Rx.Subject();
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
subject.next(1);
subject.next(2);
/*
Console output:
observerA: 1
observerB: 1
observerA: 2
observerB: 2
*/
Every Subject is an Observer, so you may provide a Subject as the argument to the subscribe of any Observable, like the example below shows:
var subject = new Rx.Subject();
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
var observable = Rx.Observable.from([1, 2, 3]);
observable.subscribe(subject); // You can subscribe providing a Subject
/*
Console output:
observerA: 1
observerB: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3
*/
BehaviorSubject
- Sends one previous value and upcoming values;
- A BehaviorSubject holds one value. When it is subscribed it emits the value immediately;
- BehaviorSubject can be created with initial value: new Rx.BehaviorSubject(1)
- You can get current value synchronously by subject.value;
- BehaviorSubject is the best for 90% of the cases to store current value comparing to other Subject types;
var subject = new Rx.BehaviorSubject(0); // 0 is the initial value
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.next(1);
subject.next(2);
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
subject.next(3);
console.log('Value async:', subject.value); // Access subject value synchronously
/*
Console output:
observerA: 0
observerA: 1
observerA: 2
observerB: 2
observerA: 3
observerB: 3
Value async: 3
*/
ReplaySubject
- Sends all previous values and upcoming values
var subject = new Rx.ReplaySubject(3); // buffer 3 values for new subscribers
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
subject.next(5);
/*
Console output:
observerA: 1
observerA: 2
observerA: 3
observerA: 4
observerB: 2
observerB: 3
observerB: 4
observerA: 5
observerB: 5
*/
AsyncSubject
- Sends one latest value when the stream will close
var subject = new Rx.AsyncSubject();
subject.subscribe({
next: (v) => console.log('observerA: ' + v)
});
subject.next(1);
subject.next(2);
subject.next(3);
subject.next(4);
subject.subscribe({
next: (v) => console.log('observerB: ' + v)
});
subject.next(5);
subject.complete();
/*
Console output:
observerA: 5
observerB: 5
*/
Sources: