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"],
]
- 要获取 lastModifiedDate,您不需要使用
getMetadata
,根据 this question 的描述,只需使用 entry.file.lastModifiedDate
,尽管也许 file()
是另一个回调。
到"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]);
}
}
- 如果您想要等待所有异步回调结束,请参见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))
在 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"],
]
- 要获取 lastModifiedDate,您不需要使用
getMetadata
,根据 this question 的描述,只需使用entry.file.lastModifiedDate
,尽管也许file()
是另一个回调。 到"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]); } }
- 如果您想要等待所有异步回调结束,请参见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))