Javascript iBuilding承诺上传文件angularJS

Javascript iBuilding承诺上传文件angularJS,javascript,angularjs,http,promise,Javascript,Angularjs,Http,Promise,我花了好几个小时才把一个文件数组上传到我的服务器上。我需要上传这个数组,然后使用这个文件数组作为参数上传一个对象。我的服务器在服务器端将上传文件的名称发送给我作为响应。我对promise的用法感到困惑,因为我得到了错误: Cannot read property 'then' of undefined 这是我的密码: function uploadImage(formData){ var deferred = $q.defer(); Image.aadd(formData).then(

我花了好几个小时才把一个文件数组上传到我的服务器上。我需要上传这个数组,然后使用这个文件数组作为参数上传一个对象。我的服务器在服务器端将上传文件的名称发送给我作为响应。我对promise的用法感到困惑,因为我得到了错误:

 Cannot read property 'then' of undefined
这是我的密码:

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", ... ]
uploadImage()
应该返回一个承诺,以便使用
then()
函数。此外,您还可以简化直接返回值的承诺

当您在
then()
中返回一个值时,该值将传递给第一个链式承诺

然后,您应该重新组织
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()

哪一行与该错误相关,生成一个包含所有文件名的数组?谢谢你们的回答和解释@Richard,效果非常好!
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
});