1

ユーザー向けのサービスを作成しようとしています。現在のユーザーを取得するためにリクエスト http を使用します。userService.getCurrentUser() を呼び出すたびにサーバーを呼び出さないようにするために、リクエストが既に送信されている場合は変数を送信しようとしたか、初めての場合はサーバーを呼び出しました。

ここに私のサービス:

angular.module('UserService', []) 
.factory('UserService', function($q , $http, $rootScope,$timeout) {
    var currentUser = null;

    return {
        getCurrentUser: function() {
                if (currentUser == null){
                var config = {};

                config.cache = true;
                config.method = "GET"; 
                config.url = "users/get_current_user";
            return $http(config)
                .then(function(response) {
                    if (typeof response.data === 'object') {
                            currentUser = response.data.user;
                        return response.data.user;
                    } else {
                        // invalid response
                        return $q.reject(response.data);
                    }

                }, function(response) {
                    // something went wrong
                    return $q.reject(response.data);
                });
                }
                else{
                    return currentUser;
                }
        }
        };     
});

残念ながら、約束がすぐに解決されないため、リクエストを数回呼び出します。これを修正して、サーバーを確実に 1 回呼び出すにはどうすればよいですか。

そして、コントローラーからこの関数を呼び出す方法は、戻り値が約束である場合があるため、.then() を使用し、値 currentUser になる場合があるためです。

4

1 に答える 1

2

保存する (そして将来の呼び出しで返す) 必要があるのは、promise そのものです。このようにして、次のことが保証されます。

  1. 関数から常に promise オブジェクトを取得します (一貫した動作)
  2. 複数のリクエストを起動することはありません。

これは、コードを次のように変更することで実現できます。

angular.module('UserService', []) 
.factory('UserService', function($q , $http, $rootScope,$timeout) {
    var currentUserPromise = null;

    return {
        getCurrentUser: function() {
            if (currentUserPromise === null) {
                var config = {};

                config.cache = true;
                config.method = "GET"; 
                config.url = "users/get_current_user";
                currentUserPromise = $http(config)
                    .then(function(response) {
                        if (typeof response.data === 'object') {
                            return response.data.user;
                        } else {
                            // invalid response
                            return $q.reject(response.data);
                        }  
                    }, function(response) {
                        // something went wrong
                        return $q.reject(response.data);
                    });
            }
            return currentUserPromise;
        }
    }
};
于 2013-11-08T23:54:23.983 に答える