【问题标题】:Angular : Create a service using $httpAngular:使用 $http 创建服务
【发布时间】:2013-11-08 23:46:18
【问题描述】:

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

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    您需要保存(并在将来的调用中返回)的是 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;
            }
        }
    };
    

    【讨论】:

    • 您好 urish,首先感谢您的回答。太好了,它工作得很好,所以就像它是在我的控制器中获取数据的承诺我需要这样做:UserService.getCurrentUser().then(function(user){$scope.currentUser = user;}),而不是那个 $ scope.currentUser = UserService.getCurrentUser() ??没有什么限制。
    • 欢迎弗拉维恩!好吧,在 AngularJS 1.2.0 之前,您可以直接将返回的 Promise 分配给范围,这将按预期工作,但由于 Angular 1.2.0-rc3 已弃用(请参阅github.com/angular/angular.js/issues/4158),您应该明确调用 . then() 正如你提到的那样在你的控制器中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多