在服务中包含的`http.get()调用返回undefined

时间:2014-04-09 17:29:15

标签: angularjs

我知道http请求正在运行,因为我从服务器接收数据,但$scope.catalogue始终未定义。我猜是因为它是在结果从服务器返回之前分配的。我虽然在处理服务中的异步内容,但是我已经处理好了吗?

angular.module('catalogue', [])
.factory('Catalogue', ['$http', function($http){
    return {
        getCatalogue: function(){
            $http.get('./server.php').then(function(response){
                return response
            });
        },
        setCatalogue: function(JSON){
            $http.post('./server.php', JSON).success(function(){return 'successfully set data'});
        }
    }
}])

然后在我的控制器中

$scope.catalogue = Catalogue.getCatalogue();

2 个答案:

答案 0 :(得分:4)

你需要回复承诺:

getCatalogue: function(){
    return $http.get('./server.php')
}

在你的代码中你做了

Catalogue.getCatalogue().then(function(response){
    $scope.catalogue = response;
});

答案 1 :(得分:1)

你可以使用角度承诺更好地保持关注点分离。 像这样:

angular.module('myapp',[])
  .service('Github', function($http, $q)
  {
    this.getRepositories = function()
      {
        var deferred = $q.defer();
        $http.get('https://api.github.com/users/defunkt')
        .success(function(response)
        {
          // do stuffs with the response
          response.username = response.login + ' ' + response.name;
          // like filtering, manipulating data, decorating data found from from api
          // now pass the response
          deferred.resolve(response);
        }).error(function(response)
        {
          deferred.resolve(response);
        });
        return deferred.promise;
      }
  })
  .controller('MainCtrl', function($scope,Github) {
       Github.getRepositories().then(function(dt){
        $scope.user = dt;
       });
  });

我刚为demo创建了一个plunker:http://plnkr.co/edit/r7Cj7H