Angular2 2.0.0-beta.15,Rxjs 5.0.0-beta.2
我有两个简单的rxjs observable,一个是共享的,一个不是(.share()调用它)
我有一个angular2组件,它订阅两个observable并在其模板中显示值,该模板也使用异步管道订阅了observable .
我点击一个按钮在两个带有一些垃圾的observable上设置.next() .
模板更新并显示每个模板的最新值 . 组件中的订阅功能不会为非共享的observable触发 . 为什么?
plunkr:https://plnkr.co/edit/IIWvnTT1zLit1eUNknkk?p=preview
@Component({
selector: 'my-app',
template: `
<div>
<div>obs1 value: {{ observable1 | async }}</div>
<div>obs2 value: {{ observable2 | async }}</div>
<button (click)="randomizeIt()">randomize it</button>
<br>
<h3>Question 1</h3>
Why is obs1's initial value (from startWith) not displayed?
<h3>Question 2</h3>
Why does our subscription to obs2 never fire on new values?<br>
check console.log to see what i mean.
</div>`,
})
export class App {
public observable1:Observable<string>;
public observer1:any;
public observable2:Observable<string>;
public observer2:any;
constructor() {
this.observable1 = Observable.create(observer => {
this.observer1 = observer;
}).startWith("initial obs 1 value").share();
this.observable1.subscribe((val) => {
console.log('YOU WILL SEE THIS:', val);
})
this.observable2 = Observable.create(observer => {
this.observer2 = observer;
}).startWith("initial obs 2 value"); // no share!
this.observable2.subscribe((val) => {
console.log('WHY DOES THIS NEVER FIRE ON NEW VALUES?:', val);
})
}
public randomizeIt() {
let r = Math.random();
console.log('set both obs to: ', r);
this.observer1.next(r);
this.observer2.next(r);
}
}
提前致谢!
1 回答
Q1 . Why is obs1's initial value (from startWith) not displayed?
来自share()文档:
这意味着,在您的情况下,
{{ observable1 | async }}
和this.observable1.subscribe(....)
共享相同的订阅,当您在构造函数中订阅observable1
时,您已经启动了序列 . 初始化视图时,已经启动了对observable1
的订阅并发出了第一个值 . 因此async
将调用subscribe()
,但不会获得序列的第一个发射 .因此,如果您将订阅移至
ngAfterViewInit()
内,则初始值将转至async
订阅 .Q2 . Why does our subscription to obs2 never fire on new values?
每次订阅 cold Observable时,实际上都会创建一个新的Observable实例 . 创建新实例时,还会创建一个新的观察者实例 . 因此,您对构造函数的订阅是可观察的
instance1
和观察者instance1
,async
的订阅是可观察的instance2
和观察者instance2
. 因此,当您调用randomizeIt()
时,将observer2
调用instance2
,该instance2
绑定到由async
订阅的可观察instance2
.为了使你的观察“热”:
Update
假设你有一个可以发出随机值的observable:
现在,每次订阅
this.observable3
时,您都会获得一个新的随机值 . 每个订户的 Value 不同 . 因为每个订户都有一个新实例 .来自文档: