BehaviorSubject 初始值不适用于 share()

BehaviorSubject initial value not working with share()

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() 的 shorthand。当第一个观察者订阅时,它会触发 refCount() 并订阅其来源,这会导致 do() 中的副作用,并且还会在观察者中打印默认值 0 sub1:

"side effect"
"0 sub1"

然后你订阅了另一个观察者,但这个订阅只对 publish() 运算符内的 Subject class 进行(这就是它的目的)。所以第二个观察者不会收到默认值 0 也不会触发副作用。

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

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