2014-12-05 128 views
0

我使用ngRoute和,並試圖讓我的路線基礎上的服務的功能,我已經定義AngularJS根據服務承諾

我的服務如下的結果來解決解決途徑:

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事件被激發,所以我是什麼,以便丟失只使用我的服務例程調用的結果?

回答

0

好的,我想出了我做錯了什麼,在我的服務中我有一個太多的返回語句,我只需要在打開$ http請求之前刪除返回關鍵字,現在它按要求工作。