Zaimplementowałem $ q.all w angularjs, ale nie mogę sprawić, by kod działał. Oto mój kod:
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);
}
A oto mój kontroler, który wywołuje usługi:
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
})
Myślę, że wystąpił problem z konfiguracją $ q.all w mojej usłudze.
then(datas)
? Spróbuj po prostupush
tak:promises.push(deffered);
deferred
nie jestdeffered
:)Odpowiedzi:
W javascript nie ma
block-level scopes
tylkofunction-level scopes
:Przeczytaj ten artykuł o javaScript Scoping and Hoisting .
Zobacz, jak debugowałem Twój kod:
var deferred= $q.defer();
wewnątrz pętli for, jest ona podnoszona na górę funkcji, oznacza to, że javascript deklaruje tę zmienną w zakresie funkcji pozafor loop
.closure scope
nawet po wykonaniu funkcji.Rozwiązanie z
angular.forEach
:Oto demo plunker: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
Moim ulubionym sposobem jest użycie
Array#map
:Oto demo plunker: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
źródło
map
do tworzenia szeregu obietnic. Bardzo proste i zwięzłe.$ http to również obietnica, możesz to uprościć:
źródło
.then()
klauzulę, ponieważ PO chce to wszystko zrobić w swoim kontrolerze, ale zasada jest całkowicie poprawna.throw
od a.then
, aby zająć się nim później i ujawnić go$exceptionHandler
, co powinno zaoszczędzić ci kłopotów i globalnej.Wydaje się, że problem polega na tym, że dodajesz
deffered.promise
kiedydeffered
polega na sam jest obietnicą, którą powinieneś dodać:Spróbuj zmienić na,
promises.push(deffered);
aby nie dodawać rozpakowanej obietnicy do tablicy.źródło
$q.all
otrzymuje obietnice, a nie odroczone obiekty. Prawdziwym problemem PO jest ustalanie zakresu i ponieważ rozwiązuje się tylko ostatni odroczonydefer
przedmiotów ipromises
. Naprawiłeś również mójall()
problem.