2016-09-26 9 views
0

私は角サービスMyServiceを持っています その中にgetメソッドがあります。それは私が3つの異なるコントローラにこのサービスを渡すとき、彼らはすべてのサーバーからの変数の値を取得する変数が定義されていない場合、変数複数のサーバーからのサービスを防ぐ

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

を返すoverwiseのにサーバーから情報を取得し、ローカル変数に設定します。 私は約束を救おうとしています。要求がすでに解決している間に要求を出していて、新しいものを作成していない場合、 は、今のコードを持つ私は、コントローラ

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

は今、このメソッドの最初の呼び出しは、約束を作成し、後続の呼び出しは、同じ1

+0

感謝を返しますアンチパターンをされて返すことに注意してくださいあなたはそんなに!!!! –

関連する問題