在Javascript FileReader API中列出文件夹中的所有文件

在Javascript FileReader API中列出文件夹中的所有文件,javascript,angularjs,filereader,Javascript,Angularjs,Filereader,我有一个有趣的问题,我认为我可以很容易地解决,但结果是一个巨大的工作。基本上,我需要枚举给定文件夹中的所有文件,当然,甚至是子文件夹中的文件 我使用readEntries编写了一个递归函数,只是为了发现该函数不一定返回所有的条目,必须再次调用它,直到返回的数组为空。我想他们之所以这样做是出于性能原因 这里是我的递归函数: var listOfFiles = []; function readcontents(folder) { function readsome(reader) {

我有一个有趣的问题,我认为我可以很容易地解决,但结果是一个巨大的工作。基本上,我需要枚举给定文件夹中的所有文件,当然,甚至是子文件夹中的文件

我使用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

编辑

到目前为止,我收到了关于使用承诺的评论,这听起来很有希望。。因此,这里是我对如何使用它的第一个猜测,请随意评论

   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
    }

到目前为止这是否正确?

如果您的问题是如何处理异步回调,这就是解决方案:

基本上,您需要输入函数。然后调用backfunction;所有的工作都需要在返回值之后完成。 如果你想在下线后做你的工作

readcontents(folder);

// here I should wait and then use the listOfFiles array

您可以从此函数返回一个承诺,然后再次应用异步回调逻辑。

您是否尝试过使用async/await或Promissions?我尝试过使用Promissions。由于某种原因,它不起作用,我得到了一个可变长度数组。例如,对于一个包含1000个项目的文件夹,我有时会得到735个项目,下次我会得到324个项目,等等。。你能告诉我如何正确使用承诺吗?@Luca请看看我的编辑告诉我们createReader是什么吗does@charlietfl这是可以的,但是如果我声明一个var defer=$q.defer对象,我如何从回调中调用defer对象的.resolve?我没有看到回调中的对象…正确,$q是承诺的角度提供者->