Подтвердить что ты не робот

Angularjs multiple $http.get request

Мне нужно сделать два вызова $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 и работать как реализация выше, чтобы передать обе данные ответа в службу?

4b9b3361

Ответ 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]);
});

Ответ 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 принять массив вместо этого.