ran*_*shu 6 rxjs rxjs5 angular2-observables
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);
Run Code Online (Sandbox Code Playgroud)
结果:
"side effect"
"0 sub1"
"side effect"
"1 sub1"
"1 sub2"
Run Code Online (Sandbox Code Playgroud)
预期结果:
"side effect"
"0 sub1"
"1 sub1" <------------- this is missing from actual result
"side effect"
"1 sub1"
"1 sub2"
Run Code Online (Sandbox Code Playgroud)
我理解这里令人困惑的是什么.
该BehaviorSubject只对订阅发出.但是,您正在使用share()内部只是简写的运算符publish()->refCount().当第一个观察者订阅它时会触发它refCount()并且它会对其源进行订阅,从而导致副作用,do()并在观察者中输出默认值0 sub1:
"side effect"
"0 sub1"
Run Code Online (Sandbox Code Playgroud)
然后你订阅另一个观察者,但是这个订阅只发给运营商Subject内部的类publish()(这就是它的用途).因此第二个观察者不会收到默认值,0也不会触发副作用.
当你稍后调用subject.next(1)它时,它会产生最后三行输出:
"side effect"
"1 sub1"
"1 sub2"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |