Angular 2 http.get请求多次执行
在我的服务中,我有一个从服务器获取数据的函数。我的应用程序的几个部分在初始化时调用此函数。我想做的是:如果已经有一个请求被发送,另一个等待它的响应,他们不需要自己发出请求 所以我的代码是:Angular 2 http.get请求多次执行,angular,rxjs,angular2-http,angular2-observables,Angular,Rxjs,Angular2 Http,Angular2 Observables,在我的服务中,我有一个从服务器获取数据的函数。我的应用程序的几个部分在初始化时调用此函数。我想做的是:如果已经有一个请求被发送,另一个等待它的响应,他们不需要自己发出请求 所以我的代码是: @Injectable() export class UserService implements OnInit { ngOnInit(){ this.getUserInformations(); }; public getUserInformations(forceRefres
@Injectable()
export class UserService implements OnInit {
ngOnInit(){
this.getUserInformations();
};
public getUserInformations(forceRefresh?: boolean): Observable<Object>{
if(this.userInformationsLastObservable == null) {
console.log('Making a request'); // called only once at init
this.userInformationsLastObservable = this.http.get(this.baseUrl + "informations")
.map((result: Response) => {
console.log('map is called'); // called 5 times at init
let userInformations = result.json();
/* So future calls will perform a new request */
this.userInformationsLastObservable = null;
return userInformations;
});
}
return this.userInformationsLastObservable;
};
}
问题是:在控制台的网络面板中,我看到在初始化时发送了5个请求。“调用map”也会打印5次,而“发出请求”只会被调用一次
我做错了什么
谢谢你的帮助
在收到另一个请求的响应后发送的请求应在组件中服务的订阅方法中注册 在组件中:
constructor(private _service: Service) { }
ngOnInit() {
this._service.getUserInformations().subscribe(
res => {
// call another service;
}
}
不管响应数组的长度如何,第二个请求只发送一次。发现问题来自我对rxjs Observable如何工作的误解。我不知道每次你订阅其中一个,它都会重新执行。 在这里,每次我订阅this.userInformationsLastObservable时,它都会再次进行http调用。我认为这个调用只会在创建时发出,然后在收到响应时通知所有订户
所以我想我会用一个主题来解决这个问题。我的应用程序的所有部分调用相同的请求,不是发送请求1,而是发送请求2。这是发送请求1。。。某个时间…,发送请求1。但是,如果已经有一个请求1处于挂起状态,他们应该等待它,而不是执行另一个请求。无论是相同的请求还是不同的请求。this.http.getthis.baseUrl+信息必须返回5个元素数组,.map迭代5次,调用主体5次。检查api中的响应。否响应仅为一个对象,我可以在控制台的“网络”选项卡中看到5个调用。请将代码片段粘贴到调用服务方法的位置确定我已编辑我的帖子。在服务onInit和组件onInit中有调用您是否在网络选项卡中实际看到5个网络请求?你能截图吗?是的:编辑了我的帖子,我现在很确定这与Angular 2服务不是单例的事实有关。将进行一些测试。事实上,“发出请求”只打印一次,表明它们都使用在应用程序模块级别声明的相同实例。这是什么。刷新;你在做什么?你检查了我的答案吗?是的,但是当函数返回空的可观察对象时,我的订阅者不会被通知HTTP请求已经完成并且永远不会得到响应。啊,好的,我不知道这些细节。我在我的HttpClient中使用ReplaySubject。使用ReplaySubject,可以指定已订阅的Replay数量。
public getConfig(): ReplaySubject<HomeConfig> {
if (this.replayConfigRequest) {
return this.replayConfigRequest;
}
this.configRequest = this.http.get<HomeConfig>(this.meta.configUrl);
this.replayConfigRequest = new ReplaySubject<HomeConfig>(1);
this.configRequest.subscribe(this.replayConfigRequest);
return this.replayConfigRequest;
}
public getConfig(): ReplaySubject<HomeConfig> {
if (this.replayConfigRequest) {
return this.replayConfigRequest;
}
this.configRequest = this.http.get<HomeConfig>(this.meta.configUrl);
this.replayConfigRequest = new ReplaySubject<HomeConfig>(1);
this.configRequest.subscribe(this.replayConfigRequest);
return this.replayConfigRequest;
}