OK, let's say I have an array of n XHR requests:
var promises = [];
var AllResults = [];
$scope.requests = [
{
"uri":"http://foo/bar/action1",
"name":"Action1"
},{
"uri":"http://bar/foo/action2",
"name":"Action2"
},{...},{...},{...}
];
var ParseMyResultsArray = function(){
console.log(AllResults);
//...
};
angular.forEach($scope.requests, function(request){
var promise = $http.get(request.uri);
promises.push(promise);
});
angular.forEach(promises, function(promise){
promise.then(function(results){
AllResults.push(results);
});
});
//Then, when all promise are resolved...
ParseMyResultsArray();
How can I be sure to call ParseMyResultsArray()
when all the promises are resolved without knowing the size of my requests
array?
Thanks for your help!
From angular docs to $http:
The $http API is based on the deferred/promise APIs exposed by the $q service.
Hence it is possible to use $q.all() method that takes an array of promises and:
combines multiple promises into a single promise that is resolved when all of the input promises are resolved
The implementation code is:
$q.all(promises).then(function () { /* All promises are resolved */ });
I know this question is over a year old but it deserves a better answer.
The code can be far more concise and the ugly outer vars promises
and AllResults
and outer function ParseMyResultsArray()
can be avoided.
Try ...
$scope.requests = [{
"uri":"http://foo/bar/action1",
"name":"Action1"
}, {
"uri":"http://bar/foo/action2",
"name":"Action2"
},{...},{...},{...
}];
$q.all($scope.requests.map(function(request) {
return $http.get(request.uri);
})).then(function(results) {
console.log(results);
//parse results array here ...
return parsedResults;
});
If further access to parsedResults
is required, then by all means keep (or return) a reference to the promise returned by $q.all(...).then(...)
. Due to the asynchronicity involved in obtaining the data, this promise of parsedResults will be far more useful than the raw outer var AllResults
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With