SORU
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 scopessadecefunction-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, javascript for 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 korunurclosure scopefonksiyonlar 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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • Techmoan

    Techmoan

    31 Mayıs 2009
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007