Angularjs 尝试以asycn方式初始化服务,但未定义

Angularjs 尝试以asycn方式初始化服务,但未定义,angularjs,Angularjs,我正在做一个angularjs项目,遇到了一个问题: 我有一个维护用户登录状态的服务。在服务加载阶段,我希望它可以检查用户是否登录,并加载用户信息,如果他们: angular.module('tripod') .factory('UserService', ['$http', function($http) { var self = this, userId = angular.element(document.querySelector('#info-base')).

我正在做一个angularjs项目,遇到了一个问题:

我有一个维护用户登录状态的服务。在服务加载阶段,我希望它可以检查用户是否登录,并加载用户信息,如果他们:

angular.module('tripod')
  .factory('UserService', ['$http', function($http) {

    var self = this,
      userId = angular.element(document.querySelector('#info-base')).attr('data-id');

    if (userId)
      $http.get('/session').then(function(response) {
        self.user = response.data;
      });

    return {

      user: self.user,

      signup: function(user) {
        return $http.post('/signup', user);
      },

      login: function(user) {
        var self = this;
        return $http.post('/login', user).then(function(response) {
          self.user = response.data;
          return self.user;
        });
      },

      logout: function() {
        return $http.get('/logout').then(function() {
          self.user = null;
        });
      },

      session: function() {
        var self = this;
        return $http.get('/session').then(function(response) {
          self.user = response.data;
          return response;
        });
      }
    };

  }]);
信息库中的数据id是用户id,如果他们登录,数据id将嵌入值,他们的配置文件将驻留在服务器的会话中,然后我希望通过http请求获取他们的配置文件。在factory的返回值中,我将属性点设置为用户信息,并认为以后可以使用它

但是当我引用UserService.user时,我没有定义。我知道http承诺不会立即返回,我尝试设置长超时,确保http承诺返回。但是UserService.user的值仍然没有定义

是的,我确实四处搜索过,但我只是想知道为什么上面的代码不起作用

请有人教我,谢谢。

请试试这个:

angular.module('tripod')
  .factory('UserService', ['$http', '$q', function ($http, $q) {
     var self = this,
       userId = angular.element(document.querySelector('#info-base')).attr('data-id');

     return {
        user: function(){
           var d = $q.defer();

           if (userId)
              $http.get('/session').then(function (response) {
                 self.user = response.data;
                 d.resolve(self.user);
              });
           return d.promise;
        }
     };
  }]).controller('myCtrl', function (UserService) {

     UserService.user().then(function (user) {
        // get your user here
     });
  });

我删除了一些功能,以便只关注重要问题。请注意,现在user是一个返回承诺($q)的函数。在控制器中,您将获得“then”块中的值,该值将在调用服务中的d.resolve(sel.user)时触发。

我遇到了类似的问题。Javascript是异步的,简短回答您的属性用户应该返回一个承诺。这样,您可以使用类似UserService.user()的内容获取用户。然后(…)。如果这对你来说还不够(对我来说不是),我建议你使用ngRoute或ui路由器“resolve”选项,这样你的控制器只有在承诺得到解决后才会存在。这对你有意义吗?谢谢罗布森,你的建议完全有意义。但我想知道为什么它不起作用。我还在学习angularjs,弄清楚这一点会对我有很大帮助。