我试图在工厂内做出承诺,然后在locationChangeStart
中进行验证。问题是locationChangeStart
并没有等待我的承诺。我可以做些什么让我的承诺等待完成?
这是我的代码,
app.run(['$rootScope','$location','KeyFactory',
function($root, $location,KeyFactory) {
$root.$on('$locationChangeStart', function(event, curr, prev) {
KeyFactory.check();
console.log(KeyFactory.GetKeyPass()); ///PRINT undefined
if(KeyFactory.GetKeyPass()== true){
console.log('authorised');
}else{
$location.path('/login');
}
});
}]);
app.factory('KeyFactory', ['$http','$log', function($http,$log) {
var key = {};
key.setKeyPass = function(set) {
key.Status = set;
}
key.GetKeyPass = function() {
return key.Status;
}
key.check = function(){
$http.post('http://localhost/api/CheckPass').success(function(data) {
console.log(data);
key.setKeyPass(true);
}).error(function (data, status){
$log.error("error you cant acess here!");
console.log(status);
});
}
return key;
}]);
答案 0 :(得分:1)
异步代码并不像您想的那样以同步方式工作。制作ajax之后,它在下一行中没有响应。在创建ajax之后的角度中,它返回一个promise
对象,该对象负责告诉response/error
将要发生。
您的代码中缺少一些内容。
check
服务方式返回承诺。.then
函数放在check
方法承诺&amp;期待在成功/错误回调中得到回应。<强>代码强>
key.check = function(){
return $http.post('http://localhost/api/CheckPass').then(function(response) {
var data = response.data;
key.setKeyPass(true);
}, function (response){
key.setKeyPass(false);
});
生成强>
KeyFactory.check().then(function(){
if(KeyFactory.GetKeyPass()== true){
console.log('authorised');
}else{
$location.path('/login');
}
});