2017-03-16 80 views
5

share()运算符应用于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仅在订阅时发出。但是,您使用share()运算符,它在内部只是publish()->refCount()的简写。当第一观察者订阅它触发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”为了让初始订阅和那么在第一个“下一个”呼叫之后的“副作用”,“1 sub1”,“1 sub2”? –