我在运行AngularJS v1.2.26时,在我的run
中有一个函数。
.run(function(....) {
authService.authCheck();
$rootScope.$on('$routeChangeStart', function(event, next, current) {
if (next.requireLogin) {
if (!authService.isLoggedIn()) {
$location.path('/login');
event.preventDefault();
}
}
});
})...
当直接访问需要身份验证的URL时,例如http://127.0.0.1:8080/secret
,该函数始终重定向到登录路径。在调试一段时间后,发现它总是返回false。但当访问默认页面并转到指定路径时,则没有任何问题。
这是我的authService
的一部分。
this.authCheck = function() {
$http({
method: 'PUT',
url: '/api/login'
}).
success(function(data, status, headers, config) {
if (status === 200) {
userIsAuthenticated = true;
} else {
userIsAuthenticated = false;
}
$rootScope.loginStatus = userIsAuthenticated;
}).
error(function(data, status, headers, config) {
userIsAuthenticated = false;
$rootScope.loginStatus = userIsAuthenticated;
});
};
this.isLoggedIn = function() {
return userIsAuthenticated;
};
每当我在
!authService.isLoggedIn()
设置断点时,即使在运行块中尝试在到达$rootScope.$on
函数之前进行身份验证,它也会评估为false。那么,究竟是什么阻止了
userIsAuthenticated
变量的状态持久性呢?
$http
)仍然被认为是异步调用吗?感谢代码片段,我回家后会试一下。 - ymg$http
调用始终是异步的,以防止浏览器锁定。而且你正在使用 promises - 返回值是一个扩展了特殊函数success
和error
的 promise :) 为了使我的示例工作,你只需要将整个东西返回即可。 - hon2a