【问题标题】:Angularjs multiple $http.get requestAngularjs 多个 $http.get 请求
【发布时间】:2013-06-06 07:18:27
【问题描述】:

我需要进行两次$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 请求并像上述实现一样工作以将响应数据传递到服务中吗?

【问题讨论】:

  • 我认为你可以链接承诺

标签: http angularjs get


【解决方案1】:

你需要的是$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]);
});

【讨论】:

  • 我打算嵌套承诺,但您的解决方案要好得多。
  • @jaux console.log($scope.product_list_1) 应该返回 API 响应,对吗?得到“未定义”。有什么线索吗?
  • @jaux,我刚刚想通了,你更新了它:) 谢谢你的努力!
  • 如何使用这种方法获取标题?
  • @guiomie “q$”是错字吗?
【解决方案2】:

有一个简单而巧妙的方法:在两个回调中调用计算。第一次调用(以先到者为准)看到不完整的数据。它应该什么都不做,只是快速退出。第二次调用同时查看产品列表并完成工作。

【讨论】:

    【解决方案3】:

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

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

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

    因此,考虑到两种或多种情况,我将采用以下方式实现:

    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 接受一个数组。

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 2019-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多