I have two behaviour subject streams what I\'m trying to forkJoin with no luck. As I imagined it gives back the two last values of it. Is this possible to implement it someh
If you don't want (or don't know when) to call complete()
, you may use combineLatest instead of forkJoin
.
With combineLatest, anytime one of the source observables (in your case your behavior subjects) emits a value, combineLatest will trigger:
let stream1 = new BehaviorSubject(2);
let stream2 = new BehaviorSubject('two');
combineLatest(stream1, stream2)
.subscribe(r => {
console.log(r);
});
stream1.next(3);
stream2.next('three');
Console log:
(2) [2, "two"] // initial state
(2) [3, "two"] // next triggered on stream1
(2) [3, "three"] // next triggered on stream2
Live demo: https://stackblitz.com/edit/rxjs-qzxo3n
Note what forkJoin() actually does from its documentation:
Wait for Observables to complete and then combine last values they emitted.
This means that forkJoin()
emits a value when all input Observable are complete. When using BehaviorSubject
this means explicitly calling complete()
on both of them:
import { Observable, BehaviorSubject, forkJoin } from 'rxjs';
const stream1 = new BehaviorSubject(2);
const stream2 = new BehaviorSubject('two');
forkJoin(stream1, stream2)
.subscribe(r => {
console.log(r);
});
stream1.complete();
stream2.complete();
See live demo: https://stackblitz.com/edit/rxjs-9nqtx6
March 2019: Updated for RxJS 6.