如何从AngularJs中的其他客户端发出$ http请求?

时间:2015-12-14 14:26:03

标签: angularjs angular-promise angular-http

当我在第一个服务中通过$ http发出请求时,有这种情况,然后我想操纵其他服务中的数据。对于某些reassons我返回的对象是空的。有什么建议?

.factory('widgetRestService',['$http','$log',function($http,$log){

  var serviceInstance = {};
  serviceInstance.getInfo = function(){
    var request = $http({method: 'GET', url: '/rest/widgets/getListInfoDashboards'})
      .then(function(success){
        serviceInstance.widgets = success.data;
        $log.debug('serviceInstance.widgets SUCCESS',serviceInstance.widgets);
      },function(error){
        $log.debug('Error ', error);
        $log.debug('serviceInstance.widgets ERROR',serviceInstance.widgets);
      });
    return request;
  };

  serviceInstance.getAllWidgets = function () {
    if (serviceInstance.widgets) {
      return serviceInstance.widgets;
    } else {
      return [];
    }
  };

  return serviceInstance;

}])

.factory('OtherService',['widgetRestService','$log', function(widgetRestService, $log){

   widgetRestService.getInfo();

   // and now I want to return widgetRestService.widgets [{things},{things},{things}]
  return widgetRestService.getAllWidgets(); // returns []

 }])
  

结果:[]

3 个答案:

答案 0 :(得分:3)

在尝试访问它返回的数据之前,您必须等待HTTP请求完成。您可以访问由getAllWidgets返回的承诺附加的then内的getInfo来执行此操作。

.factory('OtherService', ['widgetRestService','$log', function(widgetRestService, $log) {
   return widgetRestService.getInfo().then(function () {
       return widgetRestService.getAllWidgets();
   });
 }])

在某处使用OtherService

OtherService.then(function (widgets) {
    // do something with `widgets`...
});

答案 1 :(得分:2)

似乎你必须返回promise而不是响应来从另一个服务获取数据。

serviceInstance.getInfo = function(){
var deferred = $q.defer();
$http({method: 'GET', url: '/rest/widgets/getListInfoDashboards'})
    .then(function(success){
        deferred.resolve(success.data);
    },function(error){
        $log.debug('Error ', error);
        $log.debug('serviceInstance.widgets ERROR',serviceInstance.widgets);
    });
return deferred.promise;
};

答案 2 :(得分:1)

widgetRestService.getInfo()正在返回一个承诺,所以你必须等待它的解决方案:

.factory("OtherService", ["widgetRestService", "$log", "$q"
function (widgetRestService, $log, $q) {

  var deferred = $q.defer();

  widgetRestService.getInfo().then(function () {
     // only here, you're sure `serviceInstance.widgets` has been set (unless an error occurred when requesting the api)
    deferred.resolve(widgetRestService.getAllWidgets());
  });

  return deferred.promise;

}])

然后,例如在控制器中:

.controller("SomeController", ["$scope", "OtherService"
function ($scope, OtherService) {

  OtherService.then(function (allWidgets) {
    $scope.allWidgets = allWidgets;
  });

}])