【发布时间】:2017-12-07 11:45:27
【问题描述】:
我有一个有趣的问题,我以为我可以轻松解决,但结果却是一项艰巨的工作。基本上我需要枚举给定文件夹中的所有文件,当然也包括子文件夹中的文件。
我使用readEntries() 编写了一个递归函数,只是为了发现该函数不一定返回所有条目,必须再次调用它,直到返回的数组为空(我猜他们这样做是为了提高性能原因)
所以这里是我的递归函数:
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
编辑
到目前为止,我收到了关于使用听起来“有希望”的承诺的 cmets.. 所以这是我对如何使用它的第一个猜测,请随时发表评论
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
}
到目前为止是正确的吗?
【问题讨论】:
-
你尝试过使用 async/await 或 promises 吗?
-
我尝试使用承诺。由于某种原因它不起作用,我得到了一个可变长度数组。例如。有 1000 个项目的文件夹,有时我会得到 735,下次我会得到 324 等等。你能告诉我如何正确使用承诺吗?
-
@Luca 请看看我的编辑
-
告诉我们
createReader()做了什么 -
@charlietfl 是developer.mozilla.org/en-US/docs/Web/API/…
标签: javascript angularjs filereader