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

不幸的是,我几次致电我的请求,因为承诺没有立即得到解决。如何解决此问题以确保调用我的服务器一次。

以及如何从我的控制器调用此函数,因为有时返回值是一个承诺,所以我使用 .then() 有时它将是 currentUser 的值。

4

1 回答 1

2

您需要保存(并在将来的调用中返回)的是承诺本身。这样,可以保证:

  1. 您将始终从您的函数中获得一个承诺对象(一致的行为)
  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 回答