Implementé $ q.all en angularjs, pero no puedo hacer que el código funcione. Aquí está mi código:
UploadService.uploadQuestion = function(questions){
var promises = [];
for(var i = 0 ; i < questions.length ; i++){
var deffered = $q.defer();
var question = questions[i];
$http({
url : 'upload/question',
method: 'POST',
data : question
}).
success(function(data){
deffered.resolve(data);
}).
error(function(error){
deffered.reject();
});
promises.push(deffered.promise);
}
return $q.all(promises);
}
Y aquí está mi controlador que llama a los servicios:
uploadService.uploadQuestion(questions).then(function(datas){
//the datas can not be retrieved although the server has responded
},
function(errors){
//errors can not be retrieved also
})
Creo que hay algún problema al configurar $ q.all en mi servicio.
then(datas)
? Intenta solopush
esto:promises.push(deffered);
deferred
nodeffered
:)Respuestas:
En javascript no
block-level scopes
solo hayfunction-level scopes
:Lea este artículo sobre elevación y alcance de javaScript .
Vea cómo depuré su código:
var deferred= $q.defer();
dentro de un bucle for, se coloca en la parte superior de la función, significa que javascript declara esta variable en el alcance de la función fuera delfor loop
.closure scope
incluso después de que se ejecuten las funciones.Solución con
angular.forEach
:Aquí hay un plunker de demostración: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
Mi forma favorita es usar
Array#map
:Aquí hay un plunker de demostración: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
fuente
map
para construir una variedad de promesas. Muy simple y conciso.$ http también es una promesa, puedes hacerlo más simple:
fuente
.then()
omitir la cláusula ya que el OP quiere hacer todo eso en su controlador, pero el principio es totalmente correcto.throw
partir de un.then
fin de mango tanto más tarde y lo exponga a$exceptionHandler
, que debe guardar ese problema y una global.El problema parece ser que está agregando el
deffered.promise
cuándodeffered
es en sí mismo la promesa que debería agregar:Intente cambiar a
promises.push(deffered);
para no agregar la promesa no envuelta a la matriz.fuente
$q.all
obtienen promesas, no objetos diferidos. El verdadero problema del OP es con el alcance y porque solo se está resolviendo el último aplazadodefer
objetos ypromises
. También arreglaste miall()
problema.