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

时间:2017-12-07 11:45:28

标签: javascript angularjs filereader

我有一个有趣的问题,我认为我可以轻松解决但事实证明这是一项庞大的工作。基本上我需要枚举给定文件夹中的所有文件,甚至是子文件夹中的文件。

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

到目前为止是否正确?

1 个答案:

答案 0 :(得分:-1)

如果您的问题是如何使用异步回调来解决问题,那就是解决方案: Promise

基本上你需要在function.then(callbackfunction);之后完成所有需要完成的工作之后返回的值。 如果你想在行

之后开展工作
readcontents(folder);

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

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