HTML 5 FileSytem,将 FileEntry 与回调中的 MetaData 数组结合起来

HTML 5 FileSytem, combine FileEntry with MetaData array from callback

在 Chrome 扩展中使用 HTML5 文件系统 API。

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

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"],
]
  1. 要获取 lastModifiedDate,您不需要使用 getMetadata,根据 this question 的描述,只需使用 entry.file.lastModifiedDate,尽管也许 file() 是另一个回调。
  2. 到"join the two object making sure the right match is made",因为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 for more details, basically you could adjust your code and use Promise,或使用其他实现,例如setInterval,或使用变量来计算剩余的回调数。

我建议看一下 HTML 文件系统 API 的基于 Promise bro-fs 的实现 API。
要读取所有带有元数据的条目,您可以这样做:

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