Folks,
I have my code setup somewhat as below:
$scope.init = function(){
return $q.all([resource1.query(),resource2.query(),resource3.query()])
For those still trying to figure out a better way to go about this, try this:
resource.query().$promise.then(function(result) {
console.log(result);
// Do something else, like instantiate a JS driven table
});
Like @cdidyks answer this utilises $promise
, but in my opinion it is a better design pattern as it doesn't rely on all resources to be completed for assignment, and makes the $promises more accessible in less code.
$scope.data1 = resource1.query();
$scope.data2 = resource2.query();
$scope.data3 = resource3.query();
$scope.init = function() {
return $q.all([
$scope.data1.$promise,
$scope.data2.$promise,
$scope.data3.$promise
])
.then(function(result) {
console.log('all done');
doSomething($scope.data1, $scope.data2);
})
}
I ran into this problem, and it was quite confusing. The problem appears to be that calling a resource action doesn't actually return an http promise, but an empty reference (that is populated when the data returns from the server -see the return value section of the $resource docs).
I'm not sure why this results in .then(result) returning an array of unresolved promises, but to get each resource's promise, you need to use resource1.query().$promise
. To re-write your example:
$scope.init = function() {
return $q.all([resource1.query().$promise, resource2.query().$promise, resource3.query().$promise])
.then( function(result) {
$scope.data1 = result[0];
$scope.data2 = result[1];
$scope.data3 = result[2];
console.log($scope.data1);
doSomething($scope.data1,$scope.data2);
})
}
I hope that saves someone else some time.
you are printing data1 not $scope.data1
console.log(data1);
if i were you i would use it as follows
$scope.init = function(){
return $q.all([resource1.query(),resource2.query(),resource3.query()])
.then(result){
console.log(result[1]);
$scope.data1 = result[1];
$scope.data2 = result1[2];
$scope.data3 = result[3];
doSomething($scope.data1,$scope.data2);
}
}