Angular:使用$ http的数据设置工厂? (不能在工厂对象中使用$ http.get吗?)

时间:2015-02-06 05:41:47

标签: angularjs

我想拥有一个从我的数据库中返回用户的工厂。

我这样定义工厂:

angular.module('myapp')
  .factory('UserFactory', function ($http, $q, $cookieStore, AuthTokenFactory) {

    function profile () {
      var deferred = $q.defer();
      $http.get('/getprofile')
        .sucess(function (data, status, headers, config) {
          deferred.resolve(data);
        })
        .error(function (data, status, headers, config) {
          deferred.reject(data);
        });

      console.log('something');
      return deferred.promise;   
    }; 

    var user = {
      profile: profile
    };

    return user;

但是,稍后当我尝试访问用户对象的属性时,在这样的控制器中:

$scope.user = UserFactory; 

我尝试访问user.name(由我的数据库返回)我得到TypeError: undefined is not a function

这是为什么?或者,如何使用我的服务中的数据设置Factory的属性?

2 个答案:

答案 0 :(得分:1)

' getprofile'方法是异步的,它返回一个promise。您需要使用promise API分配用户:

UserFactory.profile().then(function(response) {
     $scope.user = reponse.data;
});

此外,您不需要$ q,因为$ http()已经返回了一个承诺:

function profile () {
    return $http.get('/getprofile');
}

答案 1 :(得分:0)

我愿意:

angular.module('myapp')
  .factory('UserFactory', function ($http, $cookieStore, AuthTokenFactory) {

    var request;
    var user = {};

    user.ctrl = function(callback) {
      request = $http.get('/getprofile')
        .sucess(function (data, status, headers, config) {
          user.name = data.name;
         // etc
         return callback(user)
        })
        .error(function (data, status, headers, config) {
          // handle your error
        });
       return request
    };
    user.isReady = function() { (!request) ? true : false };

    return user;
};

然后你可以调用ctrl来创建'用户和使用isReady函数确保完成http调用或使用回调函数。