2017-03-16 34 views
5

share() işleci bir BehaviorSubject öğesine uygulanır. BehaviorSubject öğesinin başlangıç ​​değeri var.BehaviorSubject başlangıç ​​değeri ile çalışma()

Hedef, tek bir paylaşılan abone oluşturmaktır. Ancak, bu paylaşılan abonelik BehaviorSubject bir başlangıç ​​değerine sahip olduğunda işe yaramaz gibi görünmüyor.

Beklenmeyen sonuçlar elde etme.

Kod aşağıda gösterilen:

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

Sonucu:

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

Beklenen Sonuç:

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

cevap

5

Burada karıştıran anlamak.

BehaviorSubject yalnızca abonelikte yayınlanır. Ancak, publish()->refCount() için sadece bir shorthand olan share() operatörünü kullanıyorsunuz. İlk gözlemci abone olduğunda o refCount() tetikler ve do() yan-etkisi neden olur ve ayrıca gözlemci 0 sub1 varsayılan değeri yazdırır kaynağına kadar abonelik yapar:

"side effect" 
"0 sub1" 

Sonra başka bir gözlemci ile abone ancak Bu abonelik sadece publish() operatörünün içindeki Subject sınıfına yapılır (işte bu böyle yapılır). Böylece ikinci gözlemci, varsayılan 0'u almaz ve yan etkiyi tetiklemez. Daha sonra subject.next(1) çağırdığınızda

o çıktının son üç satırlık yapılan edeceğiz:

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

Peki "yan etkisi", "0 sub1", ilk abonelik için "0 sub2" düzen elde edebilirsiniz ve sonra ilk "sonraki" aramanın ardından "yan etki", "1 alt1", "1 alt2"? –