【问题标题】:Imbrication promises to upload files angularJSImbrication 承诺上传文件 angularJS
【发布时间】:2017-01-09 17:03:42
【问题描述】:

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

 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", ... ]

【问题讨论】:

  • 该错误与哪一行有关?

标签: javascript angularjs http promise


【解决方案1】:

uploadImage() 应该返回一个 Promise 以获得 then() 函数。此外,您可以简化直接返回值的承诺。

当你在then() 中返回一个值时,这个值将被传递给第一个链式promise。

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() 创建一个包含所有可用文件名的数组。

【讨论】:

  • 感谢您的回答和解释@Richard,效果很好!
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2014-07-18
  • 2013-10-29
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多