【问题标题】:Listing all the files inside a folder in Javascript FileReader API在 Javascript FileReader API 中列出文件夹内的所有文件
【发布时间】: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() 做了什么

标签: javascript angularjs filereader


【解决方案1】:

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

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

readcontents(folder);

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

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

【讨论】:

  • 好的,但是如果我声明一个“var defer = $q.defer()”对象,我如何从回调中调用延迟对象的.resolve()?我没有从回调中看到对象...
  • 正确,$q 是 Promise 的 Angular 提供者 -> docs.angularjs.org/api/ng/service/$q
猜你喜欢
  • 2023-01-13
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2023-03-21
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多