2013-06-10 3 views
30

Мне нужно сделать два вызова $ 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> 

As $ http.get является асинхронным, я не получаю данные при переходе в doCalculation.

Любая идея, как я могу реализовать несколько запросов $ http.get и работать так, как описано выше, для передачи обоих данных ответа в службу?

Заранее спасибо.

+0

Я думаю, что вы можете цеплять обещания – Ven

ответ

63

Что вам нужно, это $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]); 
}); 
+0

Я собирался вложить свои обещания, но ваше решение намного лучше. – callmekatootie

+1

@jaux console.log ($ scope.product_list_1) должен вернуть права на API-ответ? Получение «undefined». любой ключ? – mushfiq

+0

@mushfiq Я обновил свой ответ, дайте ему попробовать. –

1

Там простой и Hacky способ: Вызов вычисления в обоих обратных вызовов. Первый вызов (в зависимости от того, что наступит раньше) видит неполные данные. Он должен ничего не делать, кроме как быстро выйти. Второй вызов отображает списки продуктов и выполняет эту работу.