为什么承诺在AngularJS中没有像预期的那样工作

时间:2014-02-26 11:09:08

标签: angularjs angularjs-http

在我的AngularJS应用程序中,每次更改我运行的页面的请求:

    $rootScope.$on('$locationChangeStart', function (event, next, current) {
        var user;
        $http.get('/api/Authentication/UserAuthenticated').then(function (data) {
        console.log("call");
         user = data.data;
       });   
      console.log("end of call");
    });

当我运行应用程序并测试正在发生的事情时,我在控制台中看到“{1}}之前返回”结束通话“,这意味着未设置用户。这意味着如果我想检查用户是否登录路线更改用户将是未定义的。

如何制作Angular run-> http请求,然后才继续?

2 个答案:

答案 0 :(得分:1)

我误解了这个问题。您可以让$routeProvider解析$http承诺:

var app = angular.module("myApp");

app.config(["$routeProvider", function($routeProvider) {
  $routeProvider.when("/",{
    templateUrl: "myTemplate.html",
    controller: "MyCtrl",
    resolve: {
      user: ["$http", "$q", function($http, $q) {
        var deferred = $q.defer();
        $http.get('/api/Authentication/UserAuthenticated').success(function(data){
           deferred.resolve(data.data);
        }).error(function(error) {
           deferred.resolve(false);
        });
        return deferred.promise;
      }]
    }
  });
}]);

如果获取用户数据的代码过于复杂,您可以为其创建服务,并将该服务注入$routeProvider的{​​{1}}函数。

在您的控制器中,您只需注入承诺(将予以解决):

resolve

答案 1 :(得分:0)

使用async:false。这对我有用

尝试使用此代码,而不是代码

$rootScope.$on('$locationChangeStart', function (event, next, current) {
$http({method: 'GET',
            url: '/api/Authentication/UserAuthenticated',                
            async: false
              }).success(function (data) {
            console.log("call");
            user = data.data;
             }
         console.log("end of call");   
 });