2015-09-21 11 views
6

誰かが角度の約束で私を助けることができますか?私は、ファイルオブジェクトの配列を取ってそれらを繰り返し、それぞれをアップロードする必要がある次の関数を持っています。各反復の間、約束オブジェクトはpromisesの配列にプッシュされます。私のupload関数の中には、.then()がついたcycle関数があります。これは、すべての約束オブジェクトが解決されるまで呼び出されるべきではありません。私のコードは正しいようだが、正しく動作していないと思う。画像はアップロードされますが、promisesの配列が解決されるのではなく、すぐにcycle(files).then()が呼び出されます。AngularJS約束の配列

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

最終作業コード*

よりもむしろpromises配列にdeferred.promiseを押し、その後、働いていなかった私の.success()コールバック、中deferredを解決var deferred = $q.defer();を設定し、私はちょうどずに私のUpload.upload()機能をプッシュ.success()promisesにコールバックし、それをすべて$q.all()に渡してください。

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

答えて

11

あなたはpromises配列に、約束ではなく、延期をプッシュする必要があります。

  • 約束は、リード:

    promises.push(deferred.promise); 
    

    それはあなたがこのように考えてみれば役立ちますあなたが消費者に戻そうとしているだけのオブジェクト

  • 遅延は、その読み込み専用約束の修飾語であり、あなた自身でそれを保持したいとします。
+0

ありがとう、それは私が必要としたソリューションの大半でした!私も[この記事](https://www.jonathanfielding.com/combining-promises-angular/)に出てきました。私は、少し違ったやり方でアプローチすべきだと気づきました。私は上記の私のポストに私の最終的なコードを入れます。 – ACIDSTEALTH