Saya telah menerapkan $ q.all di angularjs, tetapi saya tidak dapat membuat kode berfungsi. Ini kode saya:
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);
}
Dan inilah pengontrol saya yang memanggil layanan:
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
})
Saya rasa ada masalah saat menyiapkan $ q.all di layanan saya.
then(datas)
? Coba lakukanpush
ini:promises.push(deffered);
deferred
tidakdeffered
:)Jawaban:
Di javascript tidak
block-level scopes
hanya adafunction-level scopes
:Baca artikel ini tentang Scoping and Hoisting javaScript .
Lihat bagaimana saya men-debug kode Anda:
var deferred= $q.defer();
di dalam perulangan for itu diangkat ke atas fungsi, itu berarti bahwa javascript mendeklarasikan variabel ini pada ruang lingkup fungsi di luarfor loop
.closure scope
bahkan setelah fungsi dijalankan.Solusi dengan
angular.forEach
:Berikut ini demo plunker: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
Cara favorit saya adalah menggunakan
Array#map
:Berikut ini demo plunker: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
sumber
map
untuk membangun serangkaian janji. Sangat sederhana dan ringkas.$ http juga merupakan janji, Anda dapat membuatnya lebih sederhana:
sumber
.then()
klausul karena OP ingin melakukan semua itu di pengontrolnya, tetapi prinsipnya sepenuhnya benar.throw
dari.then
untuk menanganinya nanti dan memaparkannya$exceptionHandler
, yang akan menyelamatkan Anda dari masalah itu dan global.Masalahnya tampaknya Anda menambahkan
deffered.promise
kapandeffered
itu sendiri janji yang harus Anda tambahkan:Coba ubah menjadi
promises.push(deffered);
agar Anda tidak menambahkan janji yang belum dibungkus ke array.sumber
$q.all
mendapat janji bukan objek yang ditangguhkan. Masalah sebenarnya dari OP adalah dengan pelingkupan dan karena hanya penundaan terakhir yang diselesaikandefer
objek danpromises
. Anda memperbaikiall()
masalah saya juga.