1

目前真的在为此苦苦挣扎,所以如果有人有任何建议,那就太好了。很确定这是我把简单的事情复杂化的一个例子,但我们会看到的!

使用以下内容将文件上传到服务器

https://github.com/nervgh/angular-file-upload/wiki/Module-API

我正在为某些类型的文件创建几个文件上传器实例(不能只使用一个,因为我需要为每个文件提供不同的上传 URL)

所以我有一个类似的列表

var uploaders = [a list of file object uploaders]

我想要做的是遍历列表,调用uploadAll()每一个,然后在每个文件上传后,继续执行脚本。

问题是我认为该uploadAll函数没有实现 a promise,所以当我尝试以下代码时,脚本的其余部分会在文件成功上传之前继续执行。

这是我所拥有的

var deferred = $q.defer();

var uploaders = [my list of object uploaders]

var allUploads = uploaders.map(function(uploaders) {
    var singleUploadPromise = uploaders.uploadAll();
    return singleUploadPromise;
}); 



$q.all(allUploads).then(function() {    
    console.log('Finished uploading all files')
    deferred.resolve('Finished uploading all files');
}, function(error) {
    deferred.reject(error);
});

return deferred.promise;

文件被上传,但脚本的其余部分在它们之前执行。当我

console.log(allUploads)

我得到一个undefined项目清单。很明显我在这里出错了,但我不确定如何前进。

4

2 回答 2

1

根据查看文件上传器的代码,.uploadAll() 不会返回任何内容,但它确实有回调 .onCompleteAll()。因此,您可以创建一个延迟对象,您可以在每个上传者调用 uploadAll() 的回调函数中解析该对象。

        var uploaders = [my list of object uploaders];

        var allUploads = uploaders.map(function(uploader) {
            // you need one deffered object per uploader
            var deferred = $q.defer();

            // set up an onCompleteAll callback for each uploader
            uploader.onCompleteAll = function() {
                deferred.resolve('onCompleteAll');
            };

            // call uploadAll on each uploader
            uploader.uploadAll();

            return deferred;
    }); 


    var combinedUploads = $q.all(allUploads).then(function() {    
            console.log('Finished uploading all files');
    }, function(error) {
            console.log('error!');
    });

    return combinedUploads.promise; // assuming this was in another function
于 2016-01-21T17:49:47.643 回答
0

我猜这是导致您的问题的uploadAll()方法。

于 2016-01-19T13:41:22.820 回答