AngularJS在加载路由之前解决了承诺

时间:2016-12-26 14:35:57

标签: javascript angularjs

我试图在工厂内做出承诺,然后在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;

}]);

1 个答案:

答案 0 :(得分:1)

异步代码并不像您想的那样以同步方式工作。制作ajax之后,它在下一行中没有响应。在创建ajax之后的角度中,它返回一个promise对象,该对象负责告诉response/error将要发生。

您的代码中缺少一些内容。

  1. 您应该从check服务方式返回承诺。
  2. 然后将.then函数放在check方法承诺&期待在成功/错误回调中得到回应。
  3. <强>代码

    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');
      }
    });