BehaviorSubject初始值不能与share()一起使用

时间:2017-03-16 05:11:10

标签: rxjs rxjs5 angular2-observables

share()运算符应用于BehaviorSubject。 BehaviorSubject具有初始值。

目标是创建单个共享订阅。 但是,当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"

1 个答案:

答案 0 :(得分:5)

我理解这里令人困惑的事情。

BehaviorSubject仅在订阅时发出。但是,您使用share()运算符,其内部只是publish()->refCount()的简写。当第一个观察者订阅它时会触发refCount()并且它会对其源进行订阅,从而导致do()中的副作用,并在观察者0 sub1中打印默认值:

"side effect"
"0 sub1"

然后您订阅了另一位观察者,但此订阅仅发送到Subject运算符内的publish()类(这是它的目的)。因此,第二个观察者不会收到默认的0,也不会触发副作用。

当您稍后致电subject.next(1)时,它会输出最后三行:

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