How to convert an Observable into a BehaviorSubject?
No need to convert it.
Just create a subject and attach observable to it with : obs.subscribe(sub)
example:
var obs = new rxjs.Observable((s) => {setTimeout(()=>{s.next([1])} , 500)}) //observablevar sub = new rxjs.BehaviorSubject([0]) //create subjectobs.subscribe(sub) //<----- HERE ----- attach observable to subjectsetTimeout(() => {sub.next([2, 3])}, 1500) //subject updatedsub.subscribe(a => console.log(a)) //subscribe to subject
Note: obs.subscribe(sub)
is equivalent to :
obs.subscribe({ next: v => sub.next(v), error: v => sub.error(v), complete: () => sub.complete()})
This is how I convert my Observables to BehaviorSubjects:
import { Observable, BehaviorSubject } from 'rxjs';export function convertObservableToBehaviorSubject<T>(observable: Observable<T>, initValue: T): BehaviorSubject<T> { const subject = new BehaviorSubject(initValue); observable.subscribe(subject); return subject;}
I have pretty concerns about the use case too. But here it comes a solution, feel free vote down as long you leave feedback too. Since BehaviourSubject
and any other Subject
are Observables
,
import { BehaviorSubject, from } from 'rxjs'; import { map, mergeMap } from 'rxjs/operators';const source$ = from([1,2,3,4,5,6,7,8,9]);const bs = new BehaviorSubject('start') .pipe( mergeMap(() => source$) );bs.subscribe(console.log);