2015-09-21 16 views
6

Czy ktoś może mi pomóc z niektórymi obietnicami Angular? Mam następujące funkcje, które powinny przyjmować tablicę obiektów plików, iterować nad nimi i ładować każdy z nich. Podczas każdej iteracji obiekt obietnicy jest przesyłany do tablicy promises. W ramach mojej funkcji upload mam funkcję cycle z dołączonym .then(), której nie powinno się wywoływać, dopóki wszystkie obietnice nie zostaną rozwiązane. Myślę, że mój kod wygląda poprawnie, ale nie działa prawidłowo. Przesyłanie obrazów, ale cycle(files).then() jest wywoływane natychmiast, a nie po rozwiązaniu tablicy promises.AngularJS Array of Promises

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'); 
    }) 
}; 

końcowy kod roboczych *

Zamiast ustawiania var deferred = $q.defer(); popychanie deferred.promise do tablicy promises, a następnie rozwiązywania deferred w moim .success() zwrotnego, który nie działa, po prostu wciskam Upload.upload() funkcji bez wywołanie zwrotne .success() do promises, a następnie przekazanie tego do $q.all(), które wykonuje wszystkie operacje podnoszenia.

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); 
    }) 
}; 

Odpowiedz

11

Musisz wcisnąć obietnicę, a nie odroczony do promises tablicy:

promises.push(deferred.promise); 

to pomaga, jeśli myślisz o tym tak:

  • obietnica jest tylko do odczytu -tylko obiekt, który chcesz zwrócić konsumentom
  • odroczona jest modyfikatorem tej obietnicy tylko do odczytu i chcesz ją zachować dla siebie
+0

Dzięki, to było najbardziej potrzebne rozwiązanie! Natknąłem się również na [ten artykuł] (https://www.jonathanfielding.com/combining-promises-angular/), który uświadomił mi, że powinienem podejść do sprawy nieco inaczej. Wstawię mój ostatni kod do mojego postu powyżej. – ACIDSTEALTH