好的,这是一个快速的,我已经筋疲力尽了,让自己感到困惑:D
我正在使用angular2和RxJS Observables。
我有一个带有属性“data”的服务,它是一个在构造函数中设置的Observable,以及一个返回此observable以进行订阅的方法。
export class test{
private data: Observable<Object>
constructor(private http: Http){
this.data = this.http.get(url).map( res => res.json());
}
getData(): Observable<Object>{
return this.data
}
}
前一段时间我曾经使用过者重播主题,以便始终向新订阅者发出序列的所有值。但是,使用上面的代码,Observable似乎向新用户发出了它的最新价值。这是为了吗?
test(i: number) {
if (i > 0) {
setTimeout( () => {
this.dataService.getData().subscribe( (data) => {
this.debug.log(data);
this.test(i-1);
});
}, 2000);
}
}
test(4)
我得到每次迭代的值。我很困惑,因为一年前当我想要这种行为时,我订阅'太晚'时没有新的价值观。 本质上,我只想缓存http.get的结果,并向所有订阅者提供相同的值,而不是为每个订阅创建一个新的http请求(在getData()中返回http.get(url)..)
答案 0 :(得分:1)
我知道这个问题有点陈旧,但答案在我看来很混乱。
从方法getData()返回的Observable只是一个Observable。因此,每次消费者订阅它都会获得响应。所以它工作正常,但它确实每次都会提出新的请求。
为了缓存结果,有很多方法可以根据您想要的行为来实现。要仅缓存单个请求,我建议使用#publishBehavior运算符:
export class test{
private data: Observable<Object>;
constructor(private http: Http){
this.data = this.http.get(url)
.map(res => res.json())
.publishBehavior([])
.refCount();
}
getData(): Observable<Object>{
return this.data;
}
}
传递给publishBehavior的参数是初始值。有了这两个运营商,将在第一个用户到达时提出请求。下一个订阅者将获得缓存的答案。
在其他答案中,建议使用受试者。 publishBehavior正在使用主题。但是要直接调用next(),除非没有其他补救措施,否则考虑不好的做法,在我看来,情况并非如此。即使您直接使用Subject,也可以使用#asObservable()运算符将Observable返回到Components,这样组件就无法访问下一个,错误和完整的方法。
答案 1 :(得分:0)
没有。您需要使用Subject
。它有一个方法next()
,您将向其发送新到达的财产,以便将其推送给订阅者。
除此之外,您还应该创建一个单身的服务。每当组件在构造函数中实例化它时,它们将接收已经形成的具有所有数据的对象。每次都不需要获取数据。
此外,不是在构造函数中实例化数据,而是实现OnInit
并从那里调用服务器。