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.