angular2 rxjs共享订阅未触发
Angular2 2.0.0-beta.15,Rxjs 5.0.0-beta.2 我有两个简单的rxjs观测值,一个是共享的,另一个不是(.share()调用它) 我有一个angular2组件,它订阅两个观察值,并在其模板中显示值,它还使用异步管道订阅观察值 我单击一个按钮,在两个观察对象上设置.next(),并添加一些垃圾 模板将更新并显示每个模板的最新值。 组件中的订阅函数不会为非共享的可观察对象触发。为什么? 普朗克:angular2 rxjs共享订阅未触发,angular,rxjs,Angular,Rxjs,Angular2 2.0.0-beta.15,Rxjs 5.0.0-beta.2 我有两个简单的rxjs观测值,一个是共享的,另一个不是(.share()调用它) 我有一个angular2组件,它订阅两个观察值,并在其模板中显示值,它还使用异步管道订阅观察值 我单击一个按钮,在两个观察对象上设置.next(),并添加一些垃圾 模板将更新并显示每个模板的最新值。 组件中的订阅函数不会为非共享的可观察对象触发。为什么? 普朗克: @组件({ 选择器:“我的应用程序”, 模板:` obs1值:{{o
@组件({
选择器:“我的应用程序”,
模板:`
obs1值:{{observee1 | async}}
obs2值:{{observe2 | async}}
随机化
问题1
为什么不显示obs1的初始值(从startWith开始)?
问题2
为什么我们对obs2的订阅从未激发新的价值观?
查看console.log以了解我的意思。
`,
})
导出类应用程序{
公众可观察1:可观察;
公众观察者1:任何;
公众可观察2:可观察;
公众观察者2:任何;
构造函数(){
this.Observable 1=Observable.create(Observable=>{
this.observer 1=观察者;
}).startWith(“初始obs 1值”).share();
this.observed1.subscribe((val)=>{
log('您将看到:',val);
})
this.observe2=observeable.create(observest=>{
this.observer 2=观察者;
}).startWith(“初始obs 2值”);//无共享!
this.observe2.subscribe((val)=>{
log('为什么这不会激发新值?:',val);
})
}
公共随机性{
设r=Math.random();
log('将两个obs都设置为:',r);
this.observer.1.next(r);
this.observer 2.next(r);
}
}
提前谢谢 Q1为什么obs1的初始值(从startWith开始)不显示? 从文档中: 返回共享基础序列的单个订阅的可观察序列 这意味着,在您的例子中,
{{observable1 | async}}
和this.observable1.subscribe(..)
共享相同的订阅,当您在构造函数中订阅observable1
时,您已经启动了序列。当视图初始化时,已开始订阅observative1
,并发出第一个值。因此async
将调用subscribe()
,但不会获得序列的第一个发射
因此,如果将订阅移动到内部ngAfterViewInit()
,初始值将转到async
subscription
ngAfterViewInit(){
this.observable1.subscribe((val) => {
console.log('YOU WILL SEE THIS CHANGE:', val);
})
}
问题2为什么我们的obs2订阅从不使用新值? 每次订阅一个冷的可观察实例时,实际上创建了一个新的可观察实例。创建新实例时,也会创建一个新的观察者实例。因此,您对构造函数的订阅是可观察的
instance1
和观察者instance1
,而async
的订阅是可观察的instance2
和观察者instance2
。因此,当您调用randomizeIt()
时,您将调用observer 2
绑定到async
订阅的可观察instance2
要使您的可观察“热”:
更新假设你有一个可观测的物体,它发出一个随机值:
this.observable3 = Observable.create(observer => {
observer.next(Math.random());
});
现在,每次订阅this.observed3
时,都会得到一个新的随机值。每个订阅服务器的值都不相同。因为每个订阅服务器都有一个新实例
从文档中:
这有助于将冷热观测视为可以观看的电影或表演(“订阅”)
冷观测:电影。热门观察节目:现场表演。
重播热门节目:现场表演录制在视频中 每当你观看一部电影时,你的电影运行与其他人的运行是独立的,即使所有的电影观看者看到相同的效果。另一方面,一场现场表演被多个观众共享。如果你在现场演出中迟到,你只会错过一些。然而,若它是在视频中录制的(在RxJS中,这种情况会发生在BehaviorSubject或ReplaySubject中),您可以观看现场表演的“电影”。A.publish().refCount()现场表演是指艺术家在无人观看时停止演奏,在观众中至少有一人时重新开始演奏
问题1为什么obs1的初始值(从startWith开始)不显示? 从文档中: 返回共享基础序列的单个订阅的可观察序列 这意味着,在您的例子中,
{{observable1 | async}}
和this.observable1.subscribe(..)
共享相同的订阅,当您在构造函数中订阅observable1
时,您已经启动了序列。当视图初始化时,已开始订阅observative1
,并发出第一个值。因此async
将调用subscribe()
,但不会获得序列的第一个发射
因此,如果将订阅移动到内部ngAfterViewInit()
,初始值将转到async
subscription
ngAfterViewInit(){
this.observable1.subscribe((val) => {
console.log('YOU WILL SEE THIS CHANGE:', val);
})
}
问题2为什么我们的obs2订阅从不使用新值? 每次订阅一个冷的可观察实例时,实际上创建了一个新的可观察实例。创建新实例时,也会创建一个新的观察者实例。那么,你的订阅
this.observable3 = Observable.create(observer => {
observer.next(Math.random());
});