2017-07-12 23 views
1

Die documentation on BehaviorSubject heißt es, dass es den letzten emittierten Wert zurückgeben sollte unabhängig davon, wann ich subscribe aber es zurückgibt es nicht für mich:Warum `BehaviorSubject` emittieren nicht dem letzten Wert

const ofObservable = Rx.Observable.of(1, 2, 3); 
const subject = new Rx.BehaviorSubject(); 
ofObservable.subscribe(subject); 

subject.subscribe((v) => { 
    console.log(v); 
}, null,() => { 
    console.log('completed'); 
}); 

Die Code-Protokolle completed nur.

Die ReplaySubject funktioniert wie erwartet mit dem obigen Code und log 1, 2, 3, completed.

Antwort

3

Das Problem ist woanders.

Wenn Sie ofObservable.subscribe(subject) die Quelle beobachtbare aussendet auch die complete Meldung, die die Subject als beendet markiert und es wird nie jemals etwas emittieren.

So eine Lösung in diesem Anwendungsfall könnte vorbei nur die next Signale:

ofObservable.subscribe(val => subject.next(val)); 

Siehe Demo: http://jsbin.com/limurip/3/edit?js,console

+0

Dank, warum tut 'ReplaySubject' Arbeit dann? Wird es nicht von "vollständig" von der Quelle beobachtet beobachtet? –

+0

und mit dem Ansatz, den Sie beschrieben, wird das Thema nie abgeschlossen, oder? –

+0

Offenbar nicht, das 'ReplaySubject' ist tatsächlich nicht abonniert, aber es gibt trotzdem alle gespeicherten Werte wieder. Sie können es hier https://github.com/ReactiveX/rxjs/blob/master/src/ReplaySubject.ts#L41 sehen. Ich denke, dass es Sinn macht, weil "ReplaySubject" wirklich die gesamte Sequenz von Items wiedergeben sollte, während "BehaviorSubject" sich wie die Basis "Subject" Klasse verhalten soll, aber nur garantiert, dass immer mindestens ein Item ausgegeben wird. – martin

Verwandte Themen