服务中的$ http返回$$状态对象

时间:2017-02-01 06:16:47

标签: angularjs

我正在使用以下代码。我正在读一个json文件名是&#34; hassan.json&#34;。如果我通过$ http在控制器中读取此文件一切正常。但我想使用我从文件中读取的数据,一次又一次地在不同的控制器中,所以我为此做了一个服务。但是当我通过$ http.get()从json文件中读取数据时正在服务中,当我在我的控制器和console.log(数据)中调用该服务方法时返回<​​strong>它返回我这在控制台&#34; e {$$ state:object}。&#34;

这是控制器

app.controller('showdata', function($scope, service){
    $scope.mydata = service.getData().then(function(user){
       $scope.mydata = (user.data);
       console.log(($scope.mydata));
     });

});

这是服务我正在使用:

app.service('service', function($http, $q){
  var outData;
  this.getData = function() {
     if (this.outData === undefined) {
     var deferred = $q.defer();
     $http.get('jsons/hassan.json')
        .then(function(data){
          this.outData = data;
          deferred.resolve(data);
        },
        function(err) {
          deferred.reject(err);
        });
     return deferred.promise;
    }
    else {
        return this.outData;
    }
 }
});

3 个答案:

答案 0 :(得分:3)

$http本身就是一个承诺,因此$q中没有必要尝试使用$http&#39; s cache重写您的代码:

app.controller('showdata', function($scope, service){
  service.getData().then(function(user) {
    // no need to call user.data, service handles this
    $scope.mydata = user;
    console.log($scope.mydata);
  }).catch(function (err) {
    // handle errors here if needed
  });
});

app.service('service', function($http){
  this.getData = function() {
    return $http({
      method: 'GET',
      url: 'jsons/hassan.json',
      // cache will ensure calling ajax only once
      cache: true
    }).then(function (data) {
      // this will ensure that we get clear data in our service response
      return data.data;
    });
  };
}});

答案 1 :(得分:1)

按如下方式更改控制器:

app.controller('showdata', function($scope, service){
    service.getData().then(function(user){
       $scope.mydata = (user.data);
       console.log(($scope.mydata));
     });
});

答案 2 :(得分:0)

$http.get().then()$http.get().success()之间存在差异 将您的代码更改为:

var deferred = $q.defer();
$http.get('jsons/hassan.json')
    .success(function(data){
      this.outData = data;
      deferred.resolve(data);
    })
    .error(function(err) {
      deferred.reject(err);
    });
return deferred.promise;