2013-10-21 65 views
6

我需要使用for循環更新數組中每個對象的數據,並且一旦捕獲所有數據,就運行一個函數。我不想在此混合jQuery和做做在Angular中處理forEach Ajax調用的正確方法

這裏的適當角度的方式是我在做什麼,

$scope.units = ['u1', 'u2', 'u3']; 
    $scope.data = null; 
    //get individual unit data 
    $scope.getUnitData = function(unit){ 
     service.getUnitData(unit).success(function(response){ 
      $scope.data.push({'id' : response.id , 'value' : response.value}); 
     }); 
    }; 

    $scope.updateAllUnits = function(){ 
    $scope.data = null ; //remove existing data 
    angular.forEach($scope.units,function(val,key){ 
     $scope.getUnitData(val); 
    }; 
    console.log($scope.data); // Need to show all the data but currently it does not as the for each loop didn't complete 
    }; 

該服務被定義爲。

app.factory('service',function($http){ 
    return { 
     getUnitData : function(unit){ 
     return $http({ 
      url : myURL, 
      method : 'GET', 
      params : {'unit' : unit} 
      }); 
     } 

    } 

}); 

如何在for循環中完成所有拉動操作後收到回調?

回答

19

你的$http(...)呼叫的結果是一個承諾。這意味着您可以使用$q.all等待它們的一個陣列完成。

$scope.updateAllUnits = function(){ 
    $scope.data = null ; //remove existing data 
    var promises = []; 
    angular.forEach($scope.units,function(val,key){ 
     promises.push($scope.getUnitData(val)); 
    }); 
    $q.all(promises).then(function success(data){ 
     console.log($scope.data); // Should all be here 
    }, function failure(err){ 
     // Can handle this is we want 
    }); 
}; 
+0

代碼中的'promises'只是一個數組。 $ q如何知道這個數組有所有的對象? – lostpacket

+1

我們在同步的'forEach'裏面加入promise。當我們調用'$ q.when'時,承諾被創建,但沒有解決(仍然有數據來自服務器)。 '$ q.when'等待這一切完成。我已經刪除了大量的這個答案,因爲我意識到'$ http'已經返回一個承諾。 – Andyrooger

+0

'$ q.when'可以接受一系列承諾?如果是這樣,很好的答案! –

相關問題