AngularJS多个$http.get请求

40

我需要执行两个$http.get调用,并且我需要将返回的响应数据发送到我的服务以进行进一步的计算。

我想要像下面这样做:

function productCalculationCtrl($scope, $http, MyService){
    $scope.calculate = function(query){

            $http.get('FIRSTRESTURL', {cache: false}).success(function(data){
                $scope.product_list_1 = data;
            });

            $http.get('SECONDRESTURL', {'cache': false}).success(function(data){
                $scope.product_list_2 = data;
            });
            $scope.results = MyService.doCalculation($scope.product_list_1, $scope.product_list_2);
        }
    }

在我的标记中,我将其称为

<button class="btn" ng-click="calculate(query)">Calculate</button>

$http.get 是异步的,所以当我传递给 doCalculation 方法时,我没有得到数据。

有什么办法可以实现多个 $http.get 请求,并像以上实现一样将两个响应数据都传递到服务中吗?


我认为你可以链式调用 Promise。 - Ven
3个回答

78

你需要的是$q.all

$q添加到控制器的依赖中,然后尝试:

$scope.product_list_1 = $http.get('FIRSTRESTURL', {cache: false});
$scope.product_list_2 = $http.get('SECONDRESTURL', {'cache': false});

$q.all([$scope.product_list_1, $scope.product_list_2]).then(function(values) {
    $scope.results = MyService.doCalculation(values[0], values[1]);
});

1
@jaux console.log($scope.product_list_1) 应该返回API响应,对吧?但是却得到了“undefined”。有什么线索吗? - mushfiq
你会如何使用这个方法获取头部信息? - AshClarke
我得到了“ReferenceError: q$未定义”的错误,尽管我已经在我的服务中传递了$q(例如:function(AnotherSvc, $http, $q) ...)。...有什么线索吗? - guiomie
3
“q$”是一个打字错误吗? - Ye Liu
是的,我猜当时我很困。感谢你的帮助! - guiomie
显示剩余3条评论

1
有一个简单而不太正规的方法:在两个回调函数中都调用计算。第一次调用(无论哪一个先到)会看到不完整的数据。它什么也不应该做,只需快速退出。第二次调用将看到两个产品列表并完成工作。

0

我最近也遇到了类似的问题,所以我也要发布我的答案:

在你的情况下,你只有两个计算,而且这个数字似乎是不可变的。

但是,嘿,任何同时触发两个或更多请求的情况都可能出现这种情况。

因此,考虑到两个或更多情况,这就是我会实现的方式:

var requests = [];
requests.push($http.get('FIRSTRESTURL', {'cache': false}));
requests.push($http.get('SECONDRESTURL', {'cache': false}));

$q.all(requests).then(function (responses) {
  var values = [];
  for (var x in responses) {
    responses[x].success(function(data){
      values.push(data);
    });
  }
  $scope.results = MyService.doCalculation(values);
});

在这种情况下,doCalculation将被强制接受一个数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接