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"