2016-09-26 79 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

謝謝你真是太棒了! –