角度应用授权时多次调用Ajax

Gau*_*mar 11 angularjs

应用程序有两种类型的角色:'adam'和'eve'用户可以拥有一个或另一个角色.

角色服务来获得角色:

app.factory("AuthService",function($http, $q){
    var user = undefined;
    return {
        getRoles : function(){
            var deferred = $q.defer();
            if(user !== undefined){
                deferred.resolve(user.auth);
            }else{
                $http.get("./rest/auth", {
                }).then(function(result){
                    user = result.data;
                    deferred.resolve(user.auth);
                });
            }
            return deferred.promise;
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

路由按如下方式完成:

myApp.config(['$routeProvider', function ($routeProvider) {
    $routeProvider
        .when("/adam", {
            templateUrl: 'templates/adam.html',
            controller: 'AController'
        })
        .when("/eve", {
            templateUrl: 'templates/eve.html',
            controller: 'BController'
        })
        .when("/", {
            resolve: {
                load : function($q, $location, AuthService){
                    var defer = $q.defer();
                    AuthService.getRoles().then(function(data){
                        if(data === 'adam'){
                            $location.path('/adam');
                        }else{
                            $location.path('/eve');
                        }
                        defer.resolve();
                    });
                    return defer.promise;
                }
            }
        })
        .otherwise({ redirectTo: '/' });;
}]);
Run Code Online (Sandbox Code Playgroud)

我需要在控制器中获得角色以执行某些操作.控制器代码:

angular.element(document).ready(function () {
    AuthService.getRoles().then(function(data){
        // some operation
    });
});
Run Code Online (Sandbox Code Playgroud)

在导航到'/'时,ajax被调用两次,因为resolve和controller函数都调用了AuthService.getRoles().我如何重构代码,以便只调用一次ajax?

Mat*_*erg 4

我会把你的工厂改成这样,这样他们就能做出同样的承诺:

app.factory("AuthService", function ($http, $q) {
    var userPromise;
    return {
        getRoles : function () {
            if(!userPromise){
                userPromise = $http.get("./rest/auth", {}).then(function(result){
                    return result.data;
                });
            }

            return userPromise;
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

如果未设置,这会创建一个获取数据的承诺。此后的每次调用都会创建 Promise,因此它只会挂接到第一个调用,而不会进行后续调用。它对您不起作用的原因是因为您的用户仅在 $http.get 之后设置,因此第二次通过它仍然将其视为未定义。