2014-02-20 3 views
5

나는 선택한 파일을 반복하고 서버 파일 시스템에 추가하는 업로드 기능이 있습니다. 내 컨트롤러에서비동기 루프 기능에서 각도 약속

업로드 공장

app.factory('uploadFactory', function ($upload, $q) { 

    var uploadFactory = {}; 

    var image = { 
     Models: [], 
     Images: [], 
     uploadImages: function() { 
      var defer = $q.defer(); 
      for (var i = 0; i < this.Models.length; i++) { 
       var $file = this.Models[i].file; 
       (function (index) { 
        $upload 
         .upload({ 
          url: "/api/upload/", 
          method: "POST", 
          file: $file 
         }) 
         .success(function (data, result) { 
          // Add returned file data to model 
          var imageObject = { 
           Path: data.Path, 
           Description: image.Models[index].Description, 
           Photographer: image.Models[index].Photographer 
          }; 
          image.Images.push(imageObject); 

          defer.resolve(result); 
         }); 
       })(i); 
      } 
      return defer.promise; 
     } 
    }; 

    uploadFactory.image = function() { 
     return image; 
    }; 

    return uploadFactory; 
}); 

$scope.imageUpload = new uploadFactory.image; 
$scope.create = function() { 
    var uploadImages = $scope.imageUpload.uploadImages(); 
    uploadImages.then(function() 
     $scope.ship.Images = $scope.imageUpload.Images; 
     shipFactory.create($scope.ship).success(successPostCallback).error(errorCallback); 
    }); 
}; 

내 문제는 약속 만 루프를 통해 처음 업로드에 대한 약속을 보유하고 있다는 점이다. $q.all()에 대한 내용을 읽었지만 작동하도록 구현하는 방법을 잘 모르겠습니다.

어떻게 전체 루프를 유지할 수 있습니까? 감사!

솔루션

var image = { 
    Models: [], 
    Images: [], 
    uploadImages: function() { 
     for (var i = 0; i < this.Models.length; i++) { 
      var $file = this.Models[i].file; 
      var defer = $q.defer(); 

      (function (index) { 
       var promise = $upload 
        .upload({ 
         url: "/api/upload/", 
         method: "POST", 
         file: $file 
        }) 
        .success(function (data, result) { 
         // Add returned file data to model 
         var imageObject = { 
          Path: data.Path, 
          Description: image.Models[index].Description, 
          Photographer: image.Models[index].Photographer 
         }; 
         image.Images.push(imageObject); 

         defer.resolve(result); 
        }); 
       promises.push(promise); 
      })(i); 
     } 
     return $q.all(promises); 
    } 
}; 

답변

4

당신이 바로 $q.all() 여기에 갈 수있는 방법입니다하고 (완전히 테스트되지 않은이 -하지만 난이 적어도 올바른 방향이라고 생각 ..) :

app.factory('uploadFactory', function ($upload, $q) { 

    var uploadFactory = {}; 

    var image = { 
     Models: [], 
     Images: [], 
     uploadImages: function() { 

      var promises = []; 

      for (var i = 0; i < this.Models.length; i++) { 

       var $file = this.Models[i].file; 
       var response = $upload 
        .upload({ 
         url: "/api/upload/", 
         method: "POST", 
         file: $file 
        }) 
        .success(function (data, result) { 
         // Add returned file data to model 
         var imageObject = { 
          Path: data.Path, 
          Description: $file.Description, 
          Photographer: $file.Photographer 
         }; 
         image.Images.push(imageObject); 
        }); 

       promises.push(response); 
      } 
      return $q.all(promises); 
     } 
    }; 

    uploadFactory.image = function() { 
     return image; 
    }; 

    return uploadFactory; 
}); 
+0

이렇게하면 모든 이미지가 업로드되지만 위의 컨트롤러 코드를 볼 수 있습니다. 'uploadImages' 함수가 실행되지만'.then (function() {'안의 코드는 멈추지 않습니다.) 'uploadImages'가 올바르게 리턴합니까? – Lars

+0

업로드가 실패 할 수도 있습니다 ? $ upload.upload 약속에 .error 콜백을 추가하고 볼 수 있습니다. – jlb

+0

아니요, 이미 콜백 오류가 있습니다.이 질문의 코드를 추가하지 않아서 쉽게 읽을 수 없습니다. 내 모든 업로드는 다음과 같습니다. 유효하고 성공한 것 – Lars