我尝试将所有以目录上传方式上传的文件解析为单个文件数组。我有一个问题,我无法将所有诺言的结果合并到一个数组中。我得到一个多维数组。
function iterateThroughUploadedFiles(files, isEntry = false) {
var promises = [];
for (let i = 0; i < files.length; i++) {
let entry = isEntry ? files[i].webkitGetAsEntry() : files[i];
if (entry.isFile) {
promises.push(new Promise(function(resolve, reject) {
getFile(entry, resolve, reject);
}));
}
else if (entry.isDirectory) {
let dirReader = entry.createReader();
var promise = new Promise(function(resolve, reject) {
readEntries(dirReader, resolve, reject);
});
promises = promises.concat(promise);
}
}
return Promise.all(promises);
}
function getFile(fileEntry, resolve, reject) {
fileEntry.file(function(file) {
resolve(file)
});
}
function readEntries(dirReader, resolve, reject) {
dirReader.readEntries(function (entries) {
resolve(iterateThroughEntries(entries).then(function(result) {
return result;
}));
});
}
用法:
iterateThroughUploadedFiles(files, true).then(function(result) {
console.log(result);
});
当我执行iterateThroughUploadedFiles
函数时,result
变量是多维数组。但是,我希望将此数组展平(例如: [File(6148),Array(1),Array(0),File(14)] )。我对回调和Promises不太熟悉...因此,在使用回调和Promises时存在一些问题。
编辑:
我在readEntries(dirReader, resolve, reject)
函数中做了一个错字。应该有iterateThroughUploadedFiles
而不是iterateThroughEntries
函数。
答案 0 :(得分:0)
return Promise.all(promises);
解析为二维数组,您可以使用一些生成器函数轻松地将其展平:
function* flatten(arr) {
for(const el of arr) {
if(Array.isArray(el)) {
yield* flatten(el);
} else {
yield el;
}
}
}
return Promise.all(promises).then(array => ([...flatten(array)]));
虽然传递resolve
和reject
的工作方式不错,但是只需从getFile
函数返回一个新的Promise,就可以做到更优雅:
function getFile(fileEntry, resolve, reject) {
return new Promise(resolve => fileEntry.file(resolve));
}
然后可以轻松地将其链接
function readEntries(dirReader) {
return new Promise(resolve => dirReader.readEntries(resolve))
.then(iterateThroughEntries);
}
function iterateThroughUploadedFiles(files, isEntry = false) {
return Promise.all( files.map( file => {
let entry = isEntry ? file.webkitGetAsEntry() : file;
if (entry.isFile) {
return getFile(entry);
} else if (entry.isDirectory) {
return readEntries( entry.createReader());
}
})).then(array => ([...flatten(array)]));
}