angular2 rxjs共享订阅未触发

angular2 rxjs共享订阅未触发,angular,rxjs,Angular,Rxjs,Angular2 2.0.0-beta.15,Rxjs 5.0.0-beta.2 我有两个简单的rxjs观测值,一个是共享的,另一个不是(.share()调用它) 我有一个angular2组件,它订阅两个观察值,并在其模板中显示值,它还使用异步管道订阅观察值 我单击一个按钮,在两个观察对象上设置.next(),并添加一些垃圾 模板将更新并显示每个模板的最新值。 组件中的订阅函数不会为非共享的可观察对象触发。为什么? 普朗克: @组件({ 选择器:“我的应用程序”, 模板:` obs1值:{{o

Angular2 2.0.0-beta.15,Rxjs 5.0.0-beta.2

我有两个简单的rxjs观测值,一个是共享的,另一个不是(.share()调用它)

我有一个angular2组件,它订阅两个观察值,并在其模板中显示值,它还使用异步管道订阅观察值

我单击一个按钮,在两个观察对象上设置.next(),并添加一些垃圾

模板将更新并显示每个模板的最新值。 组件中的订阅函数不会为非共享的可观察对象触发。为什么?

普朗克:

@组件({
选择器:“我的应用程序”,
模板:`
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());
});