我有一个角色服务MyService 里面有get方法。它从服务器获取信息,如果变量未定义则将其设置为局部变量,overwise返回变量
export class MyService{
private userSettings: UserSettings;
private updateProcessing: boolean = false;
private deferred : any;
constructor(
private $http: ng.IHttpService,
private $q: ng.IQService,
private $log: ng.ILogService) {
}
public get(fromServer: boolean = false) {
var self = this;
if (self.updateProcessing) {
return self.deferred.promise;
}
else if (!self.userSettings || fromServer) {
return self.getFromServer();
} else
return self.$q.resolve(self.userSettings);
}
private getFromServer(): ng.IPromise<any> {
var self = this;
self.updateProcessing = true;
self.deferred = self.$q.defer();
var url = self.getSettingsUrl();
self.$http.get(url).then(
(result: any) => {
self.userSettings = result.data;
self.updateProcessing = false;
self.deferred.resolve(result.data);
},
error => {
this.$log.error(error);
self.updateProcessing = false;
self.deferred.reject(error);
}
);
return self.deferred.promise;
}
}
当我将此服务传递给3个不同的控制器时,它们都从服务器获取变量值。 我试图保存承诺,如果请求在结算并且不创建新请求时已经在进行。 现在我发布了我在控制器中发布的代码
this.MyService.get().then(()=>{
});
并且永远不会进入内部然后回调。 如果它很重要,我会使用版本:&#34; 1.5.8&#34;角度图书馆。
答案 0 :(得分:2)
您可以分享相同的承诺。另请注意,$http
已经返回了承诺,因此使用$q
创建新版本是一种反模式
private getFromServer(): ng.IPromise < any > {
var self = this;
self.updateProcessing = true;
// if promise not stored need to create it
if (!self.storedPromise) {
var url = self.getSettingsUrl();
self.storedPromise = self.$http.get(url).then(
(result: any) => {
self.userSettings = result.data;
self.updateProcessing = false;
return self.userSettings;
},
catch => {
this.$log.error(error);
self.updateProcessing = false;
return self.$q.reject(error);
}
);
}
// return the stored promise
return self.storedPromise;
}
现在,对此方法的第一次调用将创建承诺,后续调用将返回相同的