2016-09-26 129 views
0

我有一个角度服务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(()=>{ 
}); 

做到永不进去然后回调。 如果重要,我使用角度库的版本:“1.5.8”。

回答

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; 
} 

我们这个方法的第一次调用将创建的承诺和后续调用将返回相同的一个

+0

谢谢你真是太棒了! –