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"
答案 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"