4

如果他们尝试在应用程序中访问登录页面,我目前正在尝试将登录用户重定向到登录页面之外。与登录页面关联的控制器 -Login_controller调用授权服务中的函数 - Authorisation_service.isLoggedIn()。如果此服务返回 true,则应将用户重定向到已登录的概览页面。

通过登录控制台,我可以看到在服务返回 true 之前,条件语句已经声明了服务返回的值是未定义的。之后服务确实返回 true,但为时已晚。

如何让控制器的条件语句等待服务的返回值?

授权服务.js

myApp.factory('Authorise', ['User', '$http', '$location', '$rootScope', function( User, $http, $location, $rootScope ) {
    return {
        isLoggedIn: function() {
            if( ((sessionStorage.username && sessionStorage.authKey) && (sessionStorage.username !== "null" && sessionStorage.authKey !== "null")) || ((localStorage.username && localStorage.authKey) && (localStorage.username !== "null" && localStorage.authKey !== "null" )) ) {
                if( sessionStorage.username ) {
                    var usernameLocal = sessionStorage.username;
                    var authKeyLocal = sessionStorage.authKey;
                } else {
                    var usernameLocal = localStorage.username;
                    var authKeyLocal = localStorage.authKey;
                }
                //pass to server
                var user = User.query({ usernameLocal: usernameLocal, authKeyLocal: authKeyLocal }, function(user) {
                    if( user.loginSuccess === 1 ) {
                        return true;
                    } else {
                        return false;
                    }
                });
            } else {
                return false;
            }
        }
    };
}]);

登录控制器.js

myApp.controller( 'Login_controller', function( Authorise, $scope, $location ) {
    if( Authorise.isLoggedIn() === true ) {
        console.log("Authorise.isLoggedIn() = true");
        $location.path('/teach/overview');
    }
});
4

2 回答 2

5

smk 是对的。您可能正试图依赖服务器尚未返回的数据。“Yet”是这里的关键问题,因为很可能您的数据已从服务器正确获取,您只是在准备好之前尝试参考结果!要检查这是否属实,只需添加回调console.log(user)User.query(...)

Smk 为您指出了正确的方法——改用 PROMISE API。基本上,promise 是一个对象,当服务器准备好结果时,您可以进一步使用它来执行一些操作。为了说明这一点:

function myFunc() {
   var result = false;

   // You are calling async request to the server, so the execution won't wait for the
   // results. It will simply fire server request and proceed to next lines.
   serverCall(function(srvResponse){

      result = srvResponse.everythingIsGood; // This will be called after the whole method finishes!
   });

   return result; // This will MOST PROBABLY return 'false' all the times.
}

以及这样做的正确方法:

function theRealLogicYouWantToDo(result) {
   if (result) {
      // ...
   } else {
      // ...
   }
}

serverCall(function(srvResponse) {
   theRealLogicYouWantToDo(srvResposne.everythingIsGood);
});

这是关于 JQUERY 中所有这些的很好的教程。它不仅用于服务器调用,还用于 JS 中的其他几个地方。很好学。

于 2013-03-08T06:32:18.930 回答
3

你需要返回一个承诺

您的 angularjs 服务可以返回一个承诺,您可以在控制器中测试它的值。

于 2013-03-08T05:34:52.777 回答