angularjs - property - ng-app que es
Llamadas de recursos angulares y $ q (4)
Al igual que @cdidyks, esta respuesta utiliza $promise
, pero en mi opinión es un mejor patrón de diseño, ya que no depende de todos los recursos para completar la asignación, y hace que las $ promesas sean más accesibles en menos código.
$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);
})
}
Gente
Tengo mi código de configuración de la siguiente manera:
$scope.init = function(){
return $q.all([resource1.query(),resource2.query(),resource3.query()])
.then(result){
$scope.data1 = result[1];
$scope.data2 = result1[2];
$scope.data3 = result[3];
console.log(data1); //prints as [$resolved: false, $then: function]
doSomething($scope.data1,$scope.data2);
}
}
Tenía la impresión de que la función "entonces" se llamará solo cuando se resuelvan todos los recursos. Sin embargo, esto no es lo que estoy viendo en mi código. Si imprimo data1, me resuelvo.
¿Alguna pista de lo que me estoy perdiendo aquí?
Me encontré con este problema, y era bastante confuso. El problema parece ser que llamar a una acción de recurso en realidad no devuelve una promesa de http, sino una referencia vacía (que se rellena cuando los datos regresan del servidor; vea la sección de valor de retorno de los documentos de $ resource ).
No estoy seguro de por qué esto da como resultado que .then (resultado) devuelva una serie de promesas no resueltas, pero para obtener la promesa de cada recurso, debe usar resource1.query().$promise
. Para volver a escribir tu ejemplo:
$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);
})
}
Espero que eso le salve a alguien más tiempo.
Para aquellos que aún están tratando de encontrar una mejor manera de hacer esto, intente esto:
resource.query().$promise.then(function(result) {
console.log(result);
// Do something else, like instantiate a JS driven table
});
está imprimiendo datos1 no $ scope.data1
console.log(data1);
Si yo fuera tú, lo usaría de la siguiente manera
$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);
}
}