40

2 つの$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リクエストを実装し、上記の実装のように動作して、両方の応答データをサービスに渡す方法はありますか?

4

3 に答える 3

77

必要なのは$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]);
});
于 2013-06-10T15:27:28.023 に答える
1

シンプルでハックな方法があります: 両方のコールバックで計算を呼び出します。最初の呼び出し (いずれか早いほう) では、不完全なデータが表示されます。すぐに終了するだけです。2 番目の呼び出しでは、両方の製品リストが表示され、ジョブが実行されます。

于 2014-05-11T02:19:14.410 に答える
0

最近同様の問題が発生したため、回答も投稿します。

あなたの場合、計算は2つしかなく、この数値は変更できないようです。

しかし、一度に 2 つ以上のリクエストがトリガーされる場合は、どのような場合でもかまいません。

したがって、2 つ以上のケースを考慮すると、これが私が実装する方法です。

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 が配列を受け入れるように強制します。

于 2019-08-28T08:36:19.850 に答える