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"

最佳答案

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

"side effect"
"0 sub1"

然后,您与另一个观察者进行订阅,但是此订阅仅对Subject运算符内的publish()类进行(这是针对该类的)。因此,第二个观察者将不会收到默认的0,也不会触发副作用。

当您稍后调用subject.next(1)时,它将输出最后三行:
"side effect"
"1 sub1"
"1 sub2"

10-08 13:22