2015-09-21 5 views
6

Herkes bana bazı Angular sözleriyle yardım edebilir mi? Bir dizi dosya nesnesinde alması, üzerine yineleme yapması ve her birini yüklemesi gereken aşağıdaki işlevleri kullanıyorum. Her yineleme sırasında, bir söz nesnesi promises dizisine itilir. Benim upload işlev içinde .then() eklenmiş bir cycle işlevi var, tüm söz nesneleri çözülünceye kadar çağrılmamalıdır. Sanırım kodum doğru görünüyor, ama doğru çalışmıyor. Resimler yüklenir, ancak dizisi, promises dizisinin çözülmesinden hemen sonra çağrılır.AngularJS Vaatler Dizisi

function upload(files) { 
    var uploadCount = files.length; 
    function cycle(files) { 
     var promises = []; 
     for (var i = 0; i < files.length; i++) { 
      var deferred = $q.defer(); 
      promises.push(deferred); 
      var file = files[i]; 
      Upload.upload({ 
       url: '/photos.json', 
       file: file 
      }).success(function(){ 
       $scope.progressCurrentCount += 1; 
       deferred.resolve(); 
      }); 
     }; 
     return $q.all(promises); 
    }; 

    cycle(files).then(function(result) { 
     if(uploadCount > 1) { 
      $scope.lastAction = 'uploaded ' + uploadCount + ' photos'; 
     } else { 
      $scope.lastAction = 'uploaded ' + uploadCount + ' photo'; 
     } 
     $scope.showSuccessModal = true; 
     $scope.uploading = false; 
     $scope.failedUploads = []; 
     $scope.newPhotos = { 
      token: $scope.token, 
      files: undefined 
     }; 
     photoUploadBtn.removeClass('disabled'); 
    }) 
}; 

Final çalışma kodu *

yerine var deferred = $q.defer();promises diziye deferred.promise iterek ve sonra çalışma değildi benim .success() callback'inde, içinde deferred çözme ayarı, sadece olmadan benim Upload.upload() fonksiyonunu itmek .success(), promises'a geri dönün ve sonra tüm kaldırma işlemini yapan $q.all() numarasına iletin.

function upload(files) { 
    var uploadCount = files.length; 
    function cycle(files) { 
     var promises = []; 
     for (var i = 0; i < files.length; i++) { 
      var file = files[i]; 
      var promise = Upload.upload({ 
       url: '/photos.json', 
       file: file 
      }); 
      promises.push(promise); 
     }; 
     return $q.all(promises); 
    }; 

    cycle(files).then(function(result) { 
     if(uploadCount > 1) { 
      $scope.lastAction = 'uploaded ' + uploadCount + ' photos'; 
     } else { 
      $scope.lastAction = 'uploaded ' + uploadCount + ' photo'; 
     }; 
     $scope.showSuccessModal = true; 
     $scope.uploading = false; 
     $scope.failedUploads = []; 
     $scope.newPhotos = { 
      token: $scope.token, 
      files: undefined 
     }; 
     photoUploadBtn.removeClass('disabled'); 
     getPhotos(q); 
    }) 
}; 

cevap

11

Sen promises dizisine, bir ertelenmiş bir söz değil, itmek gerekir: Eğer böyle düşünürsen

promises.push(deferred.promise); 

O yardımcı olur:

  • söz okuma olduğunu -only nesnesine dönmek istiyorsanız,
  • ertelenmiş o salt okunur vaadin değiştiricisidir ve kendiniz için saklamak istiyorsunuz
+0

Teşekkürler, ihtiyacım olan çözümün çoğu buydu! Ayrıca bu makaleye (https://www.jonathanfielding.com/combining-promises-angular/) da rastladım. Bu da beni biraz farklı bir şekilde ele almam gerektiğini fark etti. Son kodumu yukarıdaki yazıya koyacağım. – ACIDSTEALTH