2013-10-21 8 views
6

Ich muss die Daten für jedes Objekt in einem Array mithilfe einer for-Schleife aktualisieren, und sobald alle Daten erfasst sind, führen Sie eine Funktion aus. Ich will nicht jQuery in diese mischen und es die richtige Winkel Art und Weise tun zu tunRichtiger Umgang mit forEach Ajax-Aufrufe in Angular

Hier ist, was ich tue,

$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 
    }; 

Der Service ist wie folgt definiert.

Wie bekomme ich einen Rückruf, wenn das Ziehen in der for-Schleife erfolgt ist?

Antwort

19

Das Ergebnis Ihrer $http(...) Anruf ist ein Versprechen. Das bedeutet, dass Sie $q.all verwenden können, um auf ein Array von ihnen zu warten.

$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

"Versprechungen" in Ihrem Code ist nur ein Array. Wie weiß $ q, dass dieses Array alle Objekte enthält? – lostpacket

+1

Wir drängen Versprechen in das "forEach", das synchron ist. Wenn wir '$ q.when' aufrufen, werden die Versprechen erzeugt, aber nicht gelöst (es gibt noch Daten, die vom Server kommen). Das '$ q.when' wartet darauf, dass alles abgeschlossen ist. Ich habe einen großen Teil dieser Antwort entfernt, als mir klar wurde, dass "$ http" bereits ein Versprechen zurückgibt. – Andyrooger

+0

'$ q.when' kann eine Reihe von Versprechen halten? Wenn ja, gute Antwort! –