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