Search code examples
angularjsazureangular-promiseng-file-upload

Angular chaining promises from foreach loop


I have an array of photo files that needed to upload to Azure Cloud Storage, and i using foreach loop to call upload as below:

$scope.savetemplate = function () { 
     var imagePathsArray = [];

     $scope.filesimage = [];
     $scope.filesimage.push($scope.file1);
     $scope.filesimage.push($scope.file2);
     $scope.filesimage.push($scope.file3);


    for (var i in $scope.filesimage) {
        $scope.upload($scope.filesimage[i]);
    }


    $scope.data.Images = imagePathsArray ;

     $http({
              //after finish uploads i need to post the paths 
              //of all images to save into database
     })
 };


$scope.upload = function (file) {
  Upload.upload({
       url: '/uploadImage',
       data: { file: file }
    }).then(function (resp) {
       imagePathsArray.push(resp.data);

    })
};

resp.data returns azure storage path and i need to push the paths into the imagePathsArray

How can i uses Angular Promise to wait for upload all the files finished and all the paths are stored in the imagePathsArray so i can proceed with

 $scope.data.Images = imagePathsArray ;

so that i can get the paths in the array and perform $http post?


Solution

  • You can do that with $q.all.

    var promises = [];
    for (var i in $scope.filesimage) {
        promises.push(upload($scope.filesimage[i]));
    }
    $q.all(promises).then(function() {
        $scope.data.Images = imagePathsArray ;
    
        $http.post({
              //after finish uploads i need to post the paths 
              //of all images to save into database
        });
    });
    
    function upload(file) {
        return Upload.upload({
           url: '/uploadImage',
           data: { file: file }
        }).then(function (resp) {
           imagePathsArray.push(resp.data);
        })
    };