Ich habe $ q.all in anglejs implementiert, aber ich kann den Code nicht zum Laufen bringen. Hier ist mein 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);
}
Und hier ist mein Controller, der die Dienste aufruft:
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
})
Ich denke, es gibt ein Problem beim Einrichten von $ q.all in meinem Dienst.
then(datas)
? Versuchen Sie genaupush
dies:promises.push(deffered);
deferred
nichtdeffered
:)Antworten:
In Javascript gibt es nicht
block-level scopes
nurfunction-level scopes
:Lesen Sie diesen Artikel über JavaScript Scoping und Hoisting .
Sehen Sie, wie ich Ihren Code debuggt habe:
var deferred= $q.defer();
innerhalb einer for - Schleife es gehisst an die Spitze der Funktion, bedeutet es , dass Javascript auf dem Funktionsumfang außerhalb der diese Variable deklariertfor loop
.closure scope
auch nach Ausführung von Funktionen erhalten.Lösung mit
angular.forEach
:Hier ist ein Demo-Plunker: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
Meine Lieblingsmethode ist
Array#map
:Hier ist ein Demo-Plunker: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
quelle
map
es, eine Reihe von Versprechungen zu machen. Sehr einfach und prägnant.$ http ist auch ein Versprechen, Sie können es einfacher machen:
quelle
.then()
Klausel weglassen, da das OP all das in seinem Controller tun möchte, aber das Prinzip ist völlig korrekt.throw
von einem.then
, um es später zu behandeln und es auszusetzen$exceptionHandler
, was Ihnen diesen Ärger und eine globale ersparen sollte.Das Problem scheint zu sein, dass Sie das
deffered.promise
Wanndeffered
selbst hinzufügen, das Versprechen, das Sie hinzufügen sollten:Versuchen Sie, zu zu wechseln,
promises.push(deffered);
damit Sie das unverpackte Versprechen nicht zum Array hinzufügen.quelle
$q.all
Versprechen keine zurückgestellten Objekte bekommen. Das eigentliche Problem des OP ist das Scoping und weil nur der letzte Aufschub gelöst wirddefer
Objekten undpromises
. Sie haben auch meinall()
Problem behoben .