2017-02-16 4 views
0

私の角型アプリケーションは4つのモジュールに分かれており、すべてのモジュールはユーザーの詳細を必要とするため、各モジュールからgetUserメソッドを呼び出しています。したがって、アプリケーションが4つのモジュールすべてをロードすると、getUser APIが同時に起動し、サーバー上で4つのget要求が発生します。どうすればこれを防ぐことができますか?私はgetUserメソッドでシングルトンのパターンを使用しているので、ユーザーがロードされると、単にオブジェクトからユーザーを提供します。しかし、すべてのモジュールが同時にユーザーを要求しても問題は解決しません。anglejsで同時呼び出しを処理する

私のコードは、同じ要求の約束を返します変数にUserService.getへの呼び出しを、現在の要求を格納することにより、この

getUser() { 
let defer = this.q.defer(); 

if (!this.user) { 
    this.http.get(`${this.config.apiHost}users`) 
     .success(result => { 
      this.user = result; 

      this.rootScope.$broadcast('userFound', this.user); 
      defer.resolve(this.user); 
     }) 
     .error(err => defer.reject(err)) 
} 
else { 
    defer.resolve(this.user); 
    this.rootScope.$broadcast('userFound', this.user); 
} 
return defer.promise; 
} 
+0

サービス内でコールを追加します。サービスは、ユーザーオブジェクトが存在するかどうかをチェックします。そうであれば、オブジェクトを返します。そうでなければ、get呼び出しを返します。 ** OR **あなたはコールをキャッシュすることができます – Weedoze

+0

私は既にサービスで定義されたメソッドを持っていて、ユーザーオブジェクトが存在するかどうかをチェックします。しかし、すべてのモジュールが同時にユーザーを獲得しようとすると、このアプローチは機能しません。 –

+0

あなたはui-routerを使用しますか? ..私はルーティングで解決方法を使用し、あなたのコントローラに要求の結果を渡すことを提案することができます。 –

答えて

1

のように見えます。

約束が解決されると、すべてのモジュールに解決されます。

angular.module('app').service('UserService', function ($http) { 

    var self = this; 

    var getRequestCache; 

    /** 
    * Will get the current logged in user 
    * @return user 
    */ 
    this.get = function() { 
     if (getRequestCache) { 
      return getRequestCache; 
     } 

     getRequestCache = $http({ 
      url: '/api/user', 
      method: 'GET', 
      cache: false 
     }).then(function (response) { 
      // clear request cache when request is done so that a new request can be called next time 
      getRequestCache = undefined; 
      return response.data; 
     }); 

     return getRequestCache; 
    }; 

}); 
0

ルーティングにはui-routerが使用されています。これを使用して、ページに着くときにユーザーを解決できます。あなたのルーティング設定で

:あなたのコントローラで

$stateProvider 
    .state('myPage', { 
     url: '/myPage', 
     templateUrl: 'myPage.html', 
     controller: 'myCtrl', 
     resolve: { 
      userDetails: ['UserService', function(UserService) { 
       return UserService.getUserDetails(); 
      }], 
     } 
    }) 

angular.module('myModule') 
    .controller('myCtrl', ['userDetails', function(userDetails) { 
     console.log(userDetails); 
     }]; 

ページのロード中にこれは、ユーザーの詳細情報をロードします。

0

グローバルオブジェクトとしてdeferオブジェクトを使用することでこの問題を解決しました。このオブジェクトは一度しか初期化されません。

関連する問題