Angularness使用resolve和http.get请求验证用户

时间:2015-05-04 14:45:33

标签: javascript angularjs angular-ui-router

现在我有一个简单的角度设置,它具有登录状态和云状态。我想这样做只有在用户通过身份验证后才能运行云状态。如果没有,它会将它们引导到登录状态。

到目前为止,我相信我已经设置了“解析”,如果解析失败,我会设置.run()函数重定向到登录状态。

我唯一的问题是,无论如何,我的authenticated变量得到了未定义的返回。我不确定如何合并$http.get

我是棱角分明的新人,所以如果有人有任何建议,我很乐意欣赏他们。

var routerApp = angular.module('app', ['ui.router'])

 .factory('Auth', function($http, $state, $q) {

    var factory = { isLoggedIn: isLoggedIn };
    return factory;

    function isLoggedIn() {
        $http.get('/auth/user').then(function(data) {
            return true;
        });
    }

})

.config(function($stateProvider, $urlRouterProvider, $locationProvider) {

    $locationProvider.html5Mode(true);
    $urlRouterProvider.otherwise('/cloud');

    var authenticated = ['$q', 'Auth', function ($q, Auth) { 
        var deferred = $q.defer();
        if(Auth.isLoggedIn()) deferred.resolve(); else deferred.reject();
        return deferred.promise;
    }];

    var authGuest = function($state, Auth) {
        if(Auth.isLoggedIn()) $state.transitionTo('cloud');
    }

    $stateProvider

        .state('login', {
            url: '/login',
            templateUrl: "pages/templates/login.html",
            onEnter: authGuest
        })

        .state('cloud', {
            url: '/cloud',
            templateUrl: "pages/templates/account.html",
            resolve: { authenticated: authenticated }
        })

})
.run(function ($rootScope, $state, $log) {
    $rootScope.$on('$stateChangeError', function () {
        $state.go('login');
    });
});

1 个答案:

答案 0 :(得分:0)

首先服务方法应该从isLoggedIn返回promise,其他方法应该使用该promise来解决它。然后,您无需在Auth.isLoggedIn()中使用if,因为无论如何它将会返回catchthen&的承诺。其中finally

function isLoggedIn() {
    retutn $http.get('/auth/user');
}

然后使用promise

解决这些方法
var authenticated = ['$q', 'Auth', function ($q, Auth) { 
    var deferred = $q.defer();
    Auth.isLoggedIn().then(function(){
        deferred.resolve();
    }, function(error){
        deferred.reject();
    });
    return deferred.promise;
}];

var authGuest = function($state, Auth) {
    Auth.isLoggedIn().then(function(){
       $state.transitionTo('cloud');
    }) 
}