2016-09-01 3 views
1

ファイル配列を自分のサーバーにアップロードするのに時間がかかりました。この配列をアップロードし、このファイル配列をparamsとして使用してオブジェクトをアップロードする必要があります。私のサーバは、アップロードされたファイルの名前を応答としてサーバ側に送り返します。ファイルをアップロードすることを約束していますangularJS

function uploadImage(formData){ 

var deferred = $q.defer(); 
Image.aadd(formData).then(function(data){ 
    deferred.resolve(data.data.fileName); 
    return deferred.promise; 
    }); 

} 

function uploadImages(gallery){ 

var myGallery = []; 
angular.forEach(gallery, function (image) { 
    var formData = new FormData(); 
    formData.append('file', image); 

    var promise = uploadImage(formData); 
    promise.then(function(data){ 
     myGallery.push(data.fileName); 
    }); 

}); 

var mygallery = uploadImages($scope.stock.gallery); 

// Then use mygallery ["imgName1.png","imgName2.jpg", ... ] 
+0

そのエラーはどの行に関連していますか? – Richard

答えて

1

uploadImage()then()機能を持たせるために約束を返す必要があります:

Cannot read property 'then' of undefined 

はここに私のコードです:私はエラーを取得するので、私はね、約束は使用していますと混同します。また、値を直接返すという約束を単純化することもできます。

then()の値を返すと、この値は最初の連鎖約束に渡されます。

function uploadImage(formData) { 
    return Image.add(formData).then(function(data) { 
     return data.data.fileName; 
    }); 
} 

その後、あなたはあなたのuploadImages()機能を再編成する必要があります。私は次のように提案します。

function uploadImages(gallery) { 
    var uploadPromises = gallery.map(function(image) { 
     var formData = new FormData(); 
     formData.append('file', image); 
     return uploadImage(formData); 
    }); 

    return Promise.all(uploadPromises); 
} 

uploadImages($scope.stock.gallery).then(function(mygallery) { 
    // then you should use mygallery 
}); 

説明:あなたは配列にすべてのアップロードの約束を置く必要があります。 Promise.allを使用すると、すべてのアップロードが完了した瞬間を知ることができます。次に、利用可能なすべてのファイル名を持つ配列をthen()で作成します。

+0

あなたの答えとあなたの説明の両方に感謝@リチャード、完璧に動作します! – Jibeee

関連する問題