在 Javascript FileReader API 中列出文件夹内的所有文件
Listing all the files inside a folder in Javascript FileReader API
我有一个有趣的问题,我认为我可以轻松解决,但事实证明这是一项艰巨的工作。基本上我需要枚举给定文件夹内的所有文件,当然甚至包括子文件夹内的文件。
我用 readEntries()
写了一个递归函数只是为了发现这个函数不一定 return 所有条目,它必须再次调用直到 returned array 是空的(我猜他们是出于性能原因这样做的)
所以这是我的递归函数:
var listOfFiles = [];
function readcontents(folder) {
function readsome(reader) {
reader.readEntries(function(entries) {
for (var entry of entries) {
if (entry.isDirectory) {
readsome(entry.createReader())
} else {
listOfFiles.push(entry);
}
}
if (entries.length) {
readsome(reader)
}
})
}
readsome(folder.createReader())
}
readcontents(folder);
// here I should wait and then use the listOfFiles array
现在,readEntries()
是异步的,那么我如何检测树解析何时完成?我需要等待所有异步调用结束,然后 才 继续使用 listOfFiles
编辑
到目前为止,我收到了关于使用 promises 的评论,听起来 "promising".. 所以这是我对如何使用它的第一个猜测,请随时发表评论
var listOfFiles = [];
function readcontents(folder) {
function readsome(reader) {
reader.readEntries(function(entries) {
for(var entry of entries) {
if(entry.isDirectory) {
readsome(entry.createReader())
} else {
listOfFiles.push(entry);
defer.resolve();
}
}
if(entries.length) {
readsome(reader)
}
})
}
readsome(folder.createReader())
return defer.promise;
}
defer = $q.defer(); // <- global object
readcontents(item).then(function(){
// use the array
}
目前为止正确吗?
如果您的问题是如何处理异步回调,这就是解决方案:
Promise
基本上,您需要将 function.then(callbackfunction);
所有需要完成的工作 放在 returned 值之后。
如果你想在行
之后做你的工作
readcontents(folder);
// here I should wait and then use the listOfFiles array
您可以return此函数的承诺,然后再次应用异步回调逻辑。
我有一个有趣的问题,我认为我可以轻松解决,但事实证明这是一项艰巨的工作。基本上我需要枚举给定文件夹内的所有文件,当然甚至包括子文件夹内的文件。
我用 readEntries()
写了一个递归函数只是为了发现这个函数不一定 return 所有条目,它必须再次调用直到 returned array 是空的(我猜他们是出于性能原因这样做的)
所以这是我的递归函数:
var listOfFiles = [];
function readcontents(folder) {
function readsome(reader) {
reader.readEntries(function(entries) {
for (var entry of entries) {
if (entry.isDirectory) {
readsome(entry.createReader())
} else {
listOfFiles.push(entry);
}
}
if (entries.length) {
readsome(reader)
}
})
}
readsome(folder.createReader())
}
readcontents(folder);
// here I should wait and then use the listOfFiles array
现在,readEntries()
是异步的,那么我如何检测树解析何时完成?我需要等待所有异步调用结束,然后 才 继续使用 listOfFiles
编辑
到目前为止,我收到了关于使用 promises 的评论,听起来 "promising".. 所以这是我对如何使用它的第一个猜测,请随时发表评论
var listOfFiles = [];
function readcontents(folder) {
function readsome(reader) {
reader.readEntries(function(entries) {
for(var entry of entries) {
if(entry.isDirectory) {
readsome(entry.createReader())
} else {
listOfFiles.push(entry);
defer.resolve();
}
}
if(entries.length) {
readsome(reader)
}
})
}
readsome(folder.createReader())
return defer.promise;
}
defer = $q.defer(); // <- global object
readcontents(item).then(function(){
// use the array
}
目前为止正确吗?
如果您的问题是如何处理异步回调,这就是解决方案: Promise
基本上,您需要将 function.then(callbackfunction);
所有需要完成的工作 放在 returned 值之后。
如果你想在行
readcontents(folder);
// here I should wait and then use the listOfFiles array
您可以return此函数的承诺,然后再次应用异步回调逻辑。