我有一個登錄系統...我試圖實現登錄/註銷功能的網站。angularjs-爲什麼http請求返回false並解決?
這是小提琴,我以下各項FIDDLE
這是我的路線文件:
(function() {
var onlyLoggedIn = function($location, $q, AuthService2) {
var deferred = $q.defer();
if (AuthService2.isLogin()) {
deferred.resolve();
} else {
deferred.reject();
$location.url('/login');
}
return deferred.promise;
};
angular.module('myApp', [
'ngRoute',
'myApp.login',
'myApp.home',
'myApp.logout',
'myApp.notifications'
])
.factory('AuthService2', ["$http", "$location", function($http, $location) {
//var vm = this;
var baseUrl = 'api/';
return {
isLogin: function() {
var token;
if (localStorage['entrp_token']) {
token = JSON.parse(localStorage['entrp_token']);
} else {
token = "";
}
var data = {
token: token
};
$http.post(baseUrl + 'validateUserToken', data).success(function(response) {
if (response.msg == "authorized") {
//console.log(response.msg);
return localStorage.isLogged === "true";
} else {
return localStorage.isLogged === "false";
}
});
}
}
return {
isLogin: isLogin
};
}])
.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/login', {
controller: 'LoginController',
templateUrl: 'app/components/login/loginView.html',
controllerAs: 'vm'
})
.when('/home', {
controller: 'HomeController',
templateUrl: 'app/components/home/homeView.html',
resolve: {
loggedIn: onlyLoggedIn
},
controllerAs: 'vm'
})
.when('/logout', {
controller: 'LogoutController',
templateUrl: 'app/components/login/loginView.html',
resolve: {
loggedIn: onlyLoggedIn
},
controllerAs: 'vm'
})
.when('/notifications', {
controller: 'NotificationsController',
templateUrl: 'app/components/notifications/notificationsView.html',
resolve: {
loggedIn: onlyLoggedIn
},
controllerAs: 'vm'
})
.otherwise({
redirectTo: '/login'
});
}]);
})();
用戶將訪問登錄頁面。身份驗證後,我設置了一個會話和一個本地存儲令牌。
我使用解析來檢查用戶是否有效。我爲它定義了一個函數(就像你可以從代碼中看到的那樣)。
登錄後,我可以驗證用戶並設置會話,登錄控制器將有效用戶重定向到主頁。但用戶到達路線並且他本身停留在登錄頁面中。
我的http請求很好。我檢查了它,並返回正確的結果。但我認爲該函數返回false,並且只有http請求正在執行。因爲我可以在consoel中看到http請求並返回肯定結果,所以用戶應該導航,但不會發生這種情況,因爲http請求正在延遲或什麼。
我試着給出一個警告信息,如果沒有其他的話,它總是去其他條件,不管是什麼。
if (AuthService2.isLogin()) {
deferred.resolve();
} else {
deferred.reject();
$location.url('/login');
}
這是爲什麼?我對ANgular來說非常陌生。這是角度的限制嗎?
評論示例。第一個錯誤是當你依賴於實際承諾的請求時,使用'if(Auth.isLogin())',而你正在爲'isLogin()'檢查寫入'if'而不是'.then()'。簡單地說 - 你在檢查登錄功能中混淆異步'$ http'請求登錄並且同步'if'。 – Appeiron