Javascript 使用FileReader和readAsArrayBuffer读取多个文件

Javascript 使用FileReader和readAsArrayBuffer读取多个文件,javascript,asynchronous,file-upload,callback,Javascript,Asynchronous,File Upload,Callback,我正在尝试读取多个文件并将其添加到一个数组中。我已经发现readAsArrayBuffer是一个异步函数,所以我需要等待以前的上传结束。我试图使用回调,但失败了 以下是js文件: var fileList=[]; $(文档).ready(函数(){ 函数addFiles(文件){ 对于(var i=0;i

我正在尝试读取多个文件并将其添加到一个数组中。我已经发现readAsArrayBuffer是一个异步函数,所以我需要等待以前的上传结束。我试图使用回调,但失败了


以下是js文件:

var fileList=[];
$(文档).ready(函数(){
函数addFiles(文件){
对于(var i=0;i
因此,现在我在每次迭代中都有了新的FileReader,我摆脱了对“FileReader”执行“readAsArrayBuffer”失败的
:对象已经在忙于读取blob
错误,现在我的数组中有了相同的文件,尽管我选择了不同的


+file.name
处有语法错误,在
.ready()
处缺少
,定义参数并将
读取器传递给IIFE

var fileList=[];
$(文档).ready(函数(){
函数addFiles(文件){
对于(var i=0;i

您的问题是
阅读器将被关闭-使用。forEach将意味着每个迭代在其自身的关闭中都是安全的-也不需要IILife kludges

function addFiles(files) {
    // files is not a regular Array
    [].forEach.call(files, function(file) {
        var reader = new FileReader();
        reader.onloadend = function() {
            fileList.push(reader.result);
            $('#upload-list').append('<div class="upload-list-item">' + file.name + '</div>');
        }
        reader.readAsArrayBuffer(file);
    });
}

这将保证调用
$(“#上载列表”).append
的顺序是
fileList.push(reader.result)。。。问题是
阅读器将是什么(您使用iLife修复了
文件
,但没有使用
阅读器
@JaromandaX您建议在应答中包含将
阅读器
传递给iLife的代码吗?一点也不。forEach将修复此问题,而不必求助于async/Wait等新的和过度使用的玩具,因为它们会破坏旧浏览器的兼容性,同时也没有任何好处。)all@JaromandaX不会的ld可能只将
FileReader
的一个实例定义为well@JaromandaX一直想知道:p是什么意思。我没有任何和所有的循环。这是一个“舌头挂出来”的笑脸(笑脸是一个纯文本表情符号-不确定你是否需要这个解释:p)forEach对我有用,谢谢!除了我放置了
reader.readAsArrayBuffer(文件)我想,我了解生活中的事情。
function addFiles(files) {
    return Promise.all([].map.call(files, function (file) {
        return new Promise(function (resolve, reject) {
            var reader = new FileReader();
            reader.onloadend = function () {
                resolve({ result: reader.result, file: file });
            };
            reader.readAsArrayBuffer(file);
        });
    })).then(function (results) {
        results.forEach(function (result) {
            $('#upload-list').append('<div class="upload-list-item">' + result.file.name + '</div>');
        });
        return results;
    });
}