2017-03-16 10 views
5

share()演算子がBehaviorSubjectに適用されます。 BehaviorSubjectには初期値があります。BehaviorSubjectの初期値がshare()で動作しない

目標は、単一の共有サブスクリプションを作成することです。 しかし、BehaviorSubjectが初期値を持つ場合、この共有サブスクリプションは機能していないようです。

予期しない結果が得られました。

、以下に示すコード:

let subject = new Rx.BehaviorSubject(0); 
let published = subject 
        .do(v => console.log("side effect")) 
        .share(); 

published.subscribe((v) => console.log(v+" sub1")); 
published.subscribe((v) => console.log(v+" sub2")); 

subject.next(1); 

結果:

"side effect" 
"0 sub1" 
"side effect" 
"1 sub1" 
"1 sub2" 

期待される結果:

"side effect" 
"0 sub1" 
"1 sub1" <------------- this is missing from actual result 
"side effect" 
"1 sub1" 
"1 sub2" 

答えて

5

私はここで混乱しているものを理解しています。

BehaviorSubjectはサブスクリプションでのみ発行されます。しかし、内部でpublish()->refCount()の省略形になっているshare()演算子を使用しています。最初の観察者が、それはrefCount()をトリガし、それがdo()に副作用を引き起こし、また、オブザーバー0 sub1にデフォルト値を出力し、そのソースへのサブスクリプションを作る加入した場合:

"side effect" 
"0 sub1" 

その後、別の観察者で購読するが、このサブスクリプションは、publish()オペレータ内のSubjectクラス(これはそのために作られたもの)にのみ行われます。したがって、2番目のオブザーバはデフォルトの0を受け取ることも、副作用を引き起こすこともありません。 、

"side effect" 
"1 sub1" 
"1 sub2" 
+0

だから、どのように我々は「副作用」、「0 SUB1」を達成することができ、最初のサブスクリプションの「0 SUB2」ためと:あなたは後でそれが出力の最後の3行を作ったよsubject.next(1)を呼び出す

最初の 'next'コールの後に"副作用 "、" 1 sub1 "、" 1 sub2 "? –