HTML 5 FileSytem,将FileEntry与来自回调

时间:2016-05-15 18:53:17

标签: javascript html5 google-chrome-extension html5-filesystem

在使用HTML5 FileSytem API的Chrome扩展程序中。

我正在检索文件夹中的记录列表。

var entries = [];
var metadata = [];
listFiles(folder);

function listFiles(fs) {

    var dirReader = fs.createReader();
    entries = [];

    // Call the reader.readEntries() until no more results are returned.
    var readEntries = function () {
        dirReader.readEntries(function (results) {
            if (!results.length) {
                addMeta(entries);
            } else {
                console.log(results);
                entries = entries.concat(toArray(results));
                readEntries();
            }
        });
    };

    readEntries(); // Start reading dirs.

}

FileEntry对象不包含元数据,我需要上次修改日期。我能够检索元数据对象

    function addMeta(entries) {
    for (var i = 0; i < entries.length; i++) {
        entries[i].getMetadata(function (metadata) {
            console.log(entries);
            console.log(metadata);
        });
    }
}

问题是我在回调中获取元数据。 如何加入这两个对象以确保正确匹配? 我正在寻找的简化结果是:

[
["fileName1", "modifyDate1"],
["fileName2", "modifyDate2"],
]

2 个答案:

答案 0 :(得分:2)

  1. 要获取lastModifiedDate,您不需要使用getMetadata,根据this question的说明,只需使用entry.file.lastModifiedDate,但可能file()是另一个回调。
  2. 要“加入两个对象以确保正确匹配”,由于Closures,您可以使用以下代码来获得正确的结果。 (假设您提到的数据结构为[[entry, metadata]]

    var ans = [];
    function addMeta(entries) {
        for (var i = 0; i < entries.length; i++) {
            (function(entry) {
                entry.getMetadata(function (metadata) {
                    ans.push([entry, metadata]);
                });
            }(entries[i]);
        }
    }
    
  3. 如果你想要的是等待所有异步回调结束,请参阅this answer了解更多详情,基本上你可以调整你的代码并使用Promise,或使用其他实现,如setInterval或使用变量来计算剩余的回调数。

答案 1 :(得分:0)

我建议看看基于Promise的bro-fs HTML文件系统API的实现 要阅读包含元数据的所有条目,您可以执行以下操作:

fs.readdir('dir')
  .then(entries => {
    const tasks = entries.map(entry => fs.stat(entry.fullPath))
    return Promise.all(tasks);
  })
  .then(results => console.log(results))