J'ai implémenté $ q.all dans angularjs, mais je ne peux pas faire fonctionner le code. Voici mon code:
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);
}
Et voici mon contrôleur qui appelle les services:
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
})
Je pense qu'il y a un problème pour configurer $ q.all dans mon service.
then(datas)
? Essayez justepush
ceci:promises.push(deffered);
deferred
pasdeffered
:)Réponses:
En javascript il n'y a pas
block-level scopes
quefunction-level scopes
:Lisez cet article sur la portée et le levage javaScript .
Voyez comment j'ai débogué votre code:
var deferred= $q.defer();
intérieur d'une boucle for, elle est hissée en haut de la fonction, cela signifie que javascript déclare cette variable sur la portée de la fonction en dehors dufor loop
.closure scope
même après l'exécution des fonctions.Solution avec
angular.forEach
:Voici un plunker de démonstration: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
Ma façon préférée est d'utiliser
Array#map
:Voici un plunker de démonstration: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
la source
map
pour construire un éventail de promesses. Très simple et concis.$ http est aussi une promesse, vous pouvez le rendre plus simple:
la source
.then()
article de côté car le PO veut faire tout cela dans son contrôleur, mais le principe est tout à fait correct.throw
partir d'un.then
afin de le gérer plus tard et de l' exposer à$exceptionHandler
, ce qui devrait vous éviter ce problème et un global.Le problème semble être que vous ajoutez le
deffered.promise
momentdeffered
est lui-même la promesse que vous devriez ajouter:Essayez de changer pour
promises.push(deffered);
afin de ne pas ajouter la promesse non emballée au tableau.la source
$q.all
promesses ne sont pas des objets différés. Le vrai problème de l'OP est avec la portée et parce que seul le dernier différé est résoludefer
objets etpromises
. Tu as réparé monall()
problème.