23 Ocak 2014, PERŞEMBE
Q Angularjs $.tüm
Q $uyguluyorum.angularjs, ama kodu çalışma yapabilirim. İşte benim 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);
}
Ve işte benim denetleyicisi hizmetler çağrı:
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
})
Bazı sorun q $ayar yok sanırım.benim emrimdeler. Herhangi bir yardım gerçekten takdir. Teşekkür ederim.
CEVAP
23 Ocak 2014, PERŞEMBE
Javascript yokblock-level scopes
sadecefunction-level scopes
:
javaScript Scoping and Hoisting ile ilgili bir makale okumuştum.
Sizin kod hata ayıklaması nasıl
var deferred = $q.defer();
deferred.count = i;
console.log(deferred.count); // 0,1,2,3,4,5 --< all deferred objects
// some code
.success(function(data){
console.log(deferred.count); // 5,5,5,5,5,5 --< only the last deferred object
deferred.resolve(data);
})
- Döngü için
var deferred= $q.defer();
içinde yazarkençekilirişlevi üstüne, javascriptfor loop
dışında işlev kapsamı bu değişken bildirir anlamına gelir. - Her döngü ile, sonertelenmişbir önceki geçersiz kıldı, o nesneye bir referans kurtarmak için blok düzeyinde kapsam yok.
- Zaman uyumsuz geri aramaları (başarı / hata) çağrıldığında, onlar sadece son başvuruertelenmiş nesneve sadece, o kadar çözülmüş olurs. $tüm asla kararhala diğer ertelenmiş nesneleri bekler çünkü.
- Sana ihtiyacın olanı yineleme her madde için isimsiz bir fonksiyon oluşturmaktır.
- Kapsamları işlevlere sahip olduğundan, ertelenmiş nesnelere bir referans korunur
closure scope
fonksiyonlar yürütülür sonra bile. - #Dfsq olarak yorumladı: kendisi $http bir söz verir, çünkü el ile ertelenmiş yeni bir nesne oluşturmak gerek yok.
angular.forEach
ile çözüm:
Burada bir demo plunker: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview
UploadService.uploadQuestion = function(questions){
var promises = [];
angular.forEach(questions , function(question) {
var promise = $http({
url : 'upload/question',
method: 'POST',
data : question
});
promises.push(promise);
});
return $q.all(promises);
}
En sevdiğim yol Array#map
kullanmak için:
Burada bir demo plunker: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview
UploadService.uploadQuestion = function(questions){
var promises = questions.map(function(question) {
return $http({
url : 'upload/question',
method: 'POST',
data : question
});
});
return $q.all(promises);
}
Bunu Paylaş:
ASP.NET Web API bir yöntem angularjs k...
AngularJS : $evalAsync vs $zaman aşımı...
Sunucu ve İstemci arasında Otomatik ol...
Hizmet değişkenleri izlemek için Nasıl...
Yeri değil yolu değiştirmek AngularJS ...