尝试以异步方式初始化服务但未定义

时间:2015-03-19 13:46:09

标签: angularjs

我正在做一个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;
        });
      }
    };

  }]);

info-base中的data-id是用户的id,如果他们已登录,则data-id将嵌入值,并且他们的配置文件将驻留在服务器的会话中,然后我想通过http请求获取他们的配置文件。在工厂的返回值中,我将属性指向用户信息,并认为我以后可以使用它。

但是当我引用UserService.user时,我得到了未定义。我知道http promise不会立即返回,我尝试设置一个很长的超时,确保http promise返回。但UserService.user的值仍未定义。

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

请某人教我,谢谢。

1 个答案:

答案 0 :(得分:0)

请试试这个:

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是一个返回promise(https://docs.angularjs.org/api/ng/service/ $ q)的函数。在您的控制器中,您将获得'然后'阻止,当你的服务中的d.resolve(sel.user)被调用时将被触发。