【发布时间】:2016-06-10 23:01:16
【问题描述】:
我创建了一个发出简单 GET 请求的服务:
private accountObservable = null;
constructor(private _http: Http) {
}
getAccount () {
// If we have account cached, use it instead
if (this.accountObservable === null) {
this.accountObservable = this._http.get('http://localhost/api/account')
.map(res => <Account> res.json().data)
.catch(this.handleError);
}
return this.accountObservable;
}
我在我的引导函数中添加了该服务以在全局范围内提供它(我希望为所有组件提供相同的实例):
provide(AccountService, { useClass: AccountService })
问题是当我在不同的组件中调用此服务时,每次都会发出 GET 请求。因此,如果我将它添加到 3 个组件中,即使我检查了 observable 是否已经存在,也会发出 3 个 GET 请求。
ngOnInit() {
this._accountService.getAccount().subscribe(
account => this.account = account,
error => this.errorMessage = <any>error
);
}
如何防止多次发出 GET 请求?
【问题讨论】:
-
您是否仅在引导级别
provideing 服务? (听起来您可能会将其列在所有组件的providers数组中,这将创建 3 个服务实例)。如果您只在引导级别提供它,请尝试使用Observable.share()。 (这些都是我的猜测。) -
另请参阅stackoverflow.com/a/35527616/215945,了解缓存服务器结果的稍微不同的实现。
-
是的,我只在引导程序上做
provide。我已经尝试在服务的构造中添加 console.log() 并且它只被触发一次。我在get()之后添加了share(),但没有任何区别。另一个帖子也没有用。我想这是因为在我们收到数据之前,会发出一个新的请求。因此,如果 3 个组件同时运行 getAccount(),所有组件都会发出请求,并且在其中一个组件得到响应之前它不会停止。