防止来自多个服务器负载的服务
Prevent service from multiple server loads
我有一个 angular 服务 MyService
里面有get方法。如果变量未定义,它从服务器获取信息并将其设置为局部变量,否则 return 变量
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 个不同的控制器时,它们都从服务器获取变量值。
我正在尝试保存承诺,如果请求在解决时已经在处理 whait 并且不创建新的。
现在使用我在控制器中发布的代码
this.MyService.get().then(()=>{
});
永远不要进入回调函数。
如果它很重要,我使用版本:angular 库的“1.5.8”。
你们可以分享同一个承诺。另请注意,$http
已经 return 承诺,因此使用 $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;
}
现在第一次调用此方法将创建承诺,后续调用将return相同
我有一个 angular 服务 MyService 里面有get方法。如果变量未定义,它从服务器获取信息并将其设置为局部变量,否则 return 变量
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 个不同的控制器时,它们都从服务器获取变量值。 我正在尝试保存承诺,如果请求在解决时已经在处理 whait 并且不创建新的。 现在使用我在控制器中发布的代码
this.MyService.get().then(()=>{
});
永远不要进入回调函数。 如果它很重要,我使用版本:angular 库的“1.5.8”。
你们可以分享同一个承诺。另请注意,$http
已经 return 承诺,因此使用 $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;
}
现在第一次调用此方法将创建承诺,后续调用将return相同