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