2017-07-12 14 views
1

documentation on BehaviorSubject状態最後の値を排出しない:なぜ `BehaviorSubject`は、それは関係なく、私が加入したときの最後の放出された値を返す必要がありますが、それは私のためにそれを返さないことを

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'); 
}); 

コードログcompletedのみ。

ReplaySubjectは、上記のコードでは正常に動作し、ログは1, 2, 3, completedとなります。

答えて

3

問題は他の場所です。

ofObservable.subscribe(subject)を使用すると、Observableソースからcomplete通知が出され、Subjectとマークされ、何も出力されません。

ので、このユースケース内の溶液を渡すことができる唯一のnext信号:

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

参照のデモ:http://jsbin.com/limurip/3/edit?js,console

+0

おかげで、その後、 'ReplaySubject'の作業を行い、なぜ?それは、観測可能な源から放出された「完全な」影響を受けていないのですか? –

+0

あなたが説明したアプローチでは、被験者は決して完了しませんよね? –

+0

明らかに、 'ReplaySubject'は実際には購読しませんが、格納された値はすべてとにかく再生されます。あなたはそれをhttps://github.com/ReactiveX/rxjs/blob/master/src/ReplaySubject.ts#L41で見ることができます。 BehaviorSubjectは基本 'Subject'クラスのように振る舞うはずですが、常に少なくとも1つのアイテムが必ず出てくることを保証するだけで、' ReplaySubject'は本当にアイテムのシーケンス全体を再生する必要があるからです。 – martin

関連する問題