Angularjs 为什么此工厂返回$$状态对象而不是response.data?

Angularjs 为什么此工厂返回$$状态对象而不是response.data?,angularjs,state,factory,Angularjs,State,Factory,因此,我在服务器中有一个对象集合,我想在页面加载时填充一个ng repeat 我创建了一个工厂,从服务器上的资源获取列表,如下所示: app.factory('objectArray', ['$http', function($http) { // This is returning a $$state object // instead of response.data... return $http.post('/get_collection').th

因此,我在服务器中有一个对象集合,我想在页面加载时填充一个ng repeat

我创建了一个工厂,从服务器上的资源获取列表,如下所示:

  app.factory('objectArray', ['$http', function($http) {
      // This is returning a $$state object
      // instead of response.data...
      return $http.post('/get_collection').then(function(response) {
          console.log(response.data);
          return response.data;
      });
  }]);
我以前在使用ui路由器和状态声明中的resolve属性时使用过这段代码。但是,当将此工厂直接注入控制器时,我得到的不是response.data,而是$$state对象

我的控制器如下所示:

 app.controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) {
     $scope.array = objectArray;
     console.log($scope.array);
 }]);

$http服务返回的内容(以及
objectArray
服务)称为承诺。您可以通过注册一个回调函数来访问实际数据,该函数将在数据可用时调用,即当http请求的响应从服务器返回时:

objectArray.then(function(data) {
    $scope.array = data;
});
使用resolve时,您可以直接访问数据的原因是,当resolve函数返回承诺时,路由器会等待该承诺被解析。只有这样,它才能从承诺中提取数据并将数据注入控制器


为了更好地理解承诺,您可以阅读(及其)。

正如@JB Nizet所注意到的,您的代码很好,只需在controller中解析即可 这是工作演示

angular.module('app',[]);
角度.module('app').factory('objectArray',['$http',函数($http){
//这将返回$$状态对象
//而不是响应。数据。。。
//////为了示例,更改了请求类型和url
返回$http.get('http://jsonplaceholder.typicode.com/posts/1')
.然后(功能(响应){
console.log(response.data);
返回响应数据;
});
}]);
angular.module('app').controller('applicationController',['$scope','objectArray',函数($scope,objectArray){
//////在这里解决它
objectArray.then(函数(successResponse){
$scope.array=successResponse;
log($scope.array);
});
}]);
引导(document.body,['app'])

你好{{array.title}
错误

@ angular.js:14800 [AngularJS - Leaflet] The marker definition is not valid.
17:49:07.437 angular.js:14800 [AngularJS - Leaflet]  Received invalid data on the marker $promise.
17:49:07.438 angular.js:14800 [AngularJS - Leaflet] The marker definition is not valid.
17:49:07.439 angular.js:14800 [AngularJS - Leaflet]  Received invalid data on the marker $resolved.
$$状态是问题所在

markersFactory.query().$promise.then(function(data) {
    // open_street_maps to replace google maps
    angular.extend($scope, {
        center: {
            lat:   40.7231572,
            lng:  -73.988501,
            zoom: 13,
        } ,
        markers: data,
        tiles: tilesDict.opencyclemap,
    });
});
解决方案:angular.copy

markersFactory.query().$promise.then(function(data) {
    $scope.markers        = data;
    // open_street_maps to replace google maps
    angular.extend($scope, {
        center: {
            lat:   40.7231572,
            lng:  -73.988501,
            zoom: 13,
        } ,
        markers: angular.copy($scope.markers),
        tiles: tilesDict.opencyclemap,
        });
});

竖起大拇指!。=)

可能的副本;(另请参阅)@Kenney我很好奇为什么在angular ui router中没有任何附加代码,但在本例中有{$$state:object}我不确定,但您无法从中返回值。您的方法是否类似于?返回数据承诺(通过承诺链)而不是HTTP响应承诺实际上是一件好事。OP的工厂非常好,而您的第二个示例是一个坏主意:现在调用方无法知道http请求是否/何时失败。您还应该阅读@JBNizet,我确实知道在2个示例中,必须有2个回调,也更新了答案,您是对的。不,不应该有任何回调。回报承诺是正确的方式。这就是他们的目的。@JBNizet我不同意,可能有一些条件是你不需要从承诺中返回任何东西,只需要执行回调,但仍然取决于用例,在那个特定的例子中,我说的是成功响应和错误响应的2次回调。我认为让人们选择用不同的方式做事会帮助更多人