Angular:使用$ http创建服务

时间:2013-11-08 23:46:19

标签: angularjs

我尝试为我的用户创建服务。我使用请求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;
                }
        }
        };     
});

不幸的是,我的请求时间很少,因为承诺没有立即得到解决。 我该如何解决这个问题,以确保一次调用我的服务器。

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

1 个答案:

答案 0 :(得分:2)

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

  1. 您将始终从您的函数中获取promise对象(一致行为)
  2. 您永远不会发出多个请求。
  3. 您可以通过更改代码来实现此目的:

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