AngularJS根据服务承诺解析路由

时间:2014-12-05 18:36:03

标签: angularjs angularjs-service angularjs-ng-route

我正在使用ngRoute并尝试根据我定义的服务中的函数结果来解析我的路径

我的服务如下:

app.factory('AuthService', function ($q,$location,$http) {
var isLoggedIn = false;

    return {
        hasLoginSession: function(){
            var defer = $q.defer();
            if(isLoggedIn) {
                //User has a valid session from a previous GetSession.json request
                defer.resolve(isLoggedIn);
            } else {


                return $http.get('/session/GetSession.json').success(function(data, status, headers, config) {
                    isLoggedIn = data.success;
                    if(isLoggedIn) {
                        defer.resolve(isLoggedIn);
                    }
                    else {
                        defer.reject("EX_LOGIN_SESSION_IS_UNKNOWN");
                    }
                }).
                error(function(data, status, headers, config) {
                    isLoggedIn=false;
                    defer.reject("EX_LOGIN_SESSION_IS_UNKNOWN");
                });

            }
            return defer.promise;

        }
    };

});

因此,您可以看到我只有一个简单的会话检查功能,它根据http请求的结果设置属性。

然后我就像这样进行路由设置,目前只在路径路径上进行测试:

var app = angular.module('pinpointersApp', ['ngRoute']);

app.config(
  function($routeProvider,$httpProvider) {
      //$httpProvider.interceptors.push(interceptor);

     $routeProvider.
     when('/login', {
        templateUrl: 'login.html',
        controller: 'LoginController'
      }).
      when('/map', {
        templateUrl: 'partials/map.html',
        controller: 'MapController'
      }).
      when('/locations', {
        templateUrl: 'partials/locations.html',
        controller: 'LocationsController'
       }).
     when('/', {
        templateUrl: 'partials/locations.html',
        controller: 'LocationsController',
        resolve: {
            checkSession: function ($q,AuthService) {
                //var defer = $q.defer();
                //defer.reject("EX_LOGIN_SESSION_IS_UNKNOWN");
                //return defer.promise;
                return AuthService.hasLoginSession();

            }

        }


    });

});

app.run(['$rootScope', 'AuthService', function ($rootScope, AuthService) {
   $rootScope.$on("$routeChangeError", function (event, current, previous, error) {
       console.log(error);
       //Perform other stuff here, e.g. redirect to login view
   });

}]);

正在进行服务器端请求,我看到视图加载暂停,直到收到响应。在我的测试中,我返回一个失败的情况,所以拒绝承诺的状态,以便导致$ routeChangeError被触发,但它永远不会,我的视图继续加载。

如果我在我的解析块中使用注释掉的测试代码行而不是我的服务例程调用,那么

resolve: {
            checkSession: function ($q,AuthService) {
                var defer = $q.defer();
                defer.reject("EX_LOGIN_SESSION_IS_UNKNOWN");
                return defer.promise;
                //return AuthService.hasLoginSession();

            }

        }

然后触发了routeChangeError事件,那么为了只使用我的服务例程调用的结果我缺少什么?

1 个答案:

答案 0 :(得分:0)

好的,我弄清楚我做错了什么,在我的服务中我有一个太多的返回语句,我只需要在打开$ http请求之前删除return关键字,现在它可以根据需要运行。