2017-03-16 3 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 클래스에만 적용됩니다 (이것이 그 목적입니다). 따라서 두 번째 관찰자는 기본값 0을받지 못하거나 부작용을 유발하지 않습니다. 나중에 subject.next(1)를 호출 할 때

가 출력의 마지막 세 줄을 만들 수 있습니다 :

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

그래서 우리가 어떻게 "부작용", "0 SUB1"초기 가입에 대한 "0 SUB2"순서를 달성 할 수 있으며, 첫 번째 next 호출 후 "부작용", "1 sub1", "1 sub2"? –