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

ran*_*shu 6 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);
Run Code Online (Sandbox Code Playgroud)

结果:

"side effect"
"0 sub1"
"side effect"
"1 sub1"
"1 sub2"
Run Code Online (Sandbox Code Playgroud)

预期结果:

"side effect"
"0 sub1"
"1 sub1"  <------------- this is missing from actual result
"side effect"
"1 sub1"
"1 sub2"
Run Code Online (Sandbox Code Playgroud)

mar*_*tin 6

我理解这里令人困惑的是什么.

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

"side effect"
"0 sub1"
Run Code Online (Sandbox Code Playgroud)

然后你订阅另一个观察者,但是这个订阅只发给运营商Subject内部的类publish()(这就是它的用途).因此第二个观察者不会收到默认值,0也不会触发副作用.

当你稍后调用subject.next(1)它时,它会产生最后三行输出:

"side effect"
"1 sub1"
"1 sub2"
Run Code Online (Sandbox Code Playgroud)