我正在尝试使用Google Chrome的Filesystem API迭代目录以检索文件。
在第25行files.push(file);
上,尝试填充files
数组似乎没有被调用。但是,如果我用console.log(file);
替换它,它会突然起作用,但只能使用该函数。
任何人都可以解释发生了什么以及我做错了什么?将任何目录放入以下JSFiddle框中以查看:
http://jsfiddle.net/tekky/ZXU8v/8/
代码:
var dndbox = $(".dndbox")[0];
dndbox.addEventListener("dragenter", function(e) {
e.stopPropagation();
e.preventDefault();
},false);
dndbox.addEventListener("dragover", function(e) {
e.stopPropagation();
e.preventDefault();
},false);
dndbox.addEventListener("drop", function(e) {
e.stopPropagation();
e.preventDefault();
var itemList = e.dataTransfer.items;
var files = [];
var traverse = function(entry)
{
if (entry.isFile) {
entry.file(function(file){
files.push(file);
});
} else if (entry.isDirectory){
var dR = entry.createReader();
dR.readEntries(function(entries) {
for(var i = 0; i < entries.length; i++)
{
traverse(entries[i]);
}
});
}
}
for(var i = 0; i < itemList.length; i++) {
var e = itemList[i].webkitGetAsEntry();
traverse(e);
}
console.log(files); //Empty?
},false);
答案 0 :(得分:1)
您提供给entry.file()
的回调是异步的,因此它会在 console.log(file)
之后为每个文件返回。
如果您在第25行放入console.log(files)
,则可以看到它在每次回调被触发时都会更新。因此,如果您想对所有文件执行某些操作,则需要等待每个回调执行。
这是一个等待所有文件都返回的简单示例:http://jsfiddle.net/6Tn8W/。
我还建议您查看promises。
编辑:这是使用promises和when()函数的示例。这是我第一次使用jQuery实现promise,所以可能有更好的方法来实现这一点:)