Javascript 找出不是';不要被叫
我正在尝试使用Google Chrome的文件系统API遍历目录以检索文件 第25行Javascript 找出不是';不要被叫,javascript,google-chrome,Javascript,Google Chrome,我正在尝试使用Google Chrome的文件系统API遍历目录以检索文件 第25行files.push(文件),尝试填充文件数组似乎没有被调用。但是,如果我将其替换为console.log(文件)它会突然工作,但只在该功能下工作 谁能解释一下发生了什么事,我做错了什么?将任何目录放入以下JSFIDLE框中以查看: 代码: var dndbox=$(“.dndbox”)[0]; dndbox.addEventListener(“dragenter”,函数(e){ e、 停止传播(); e、 预
files.push(文件)代码>,尝试填充文件
数组似乎没有被调用。但是,如果我将其替换为console.log(文件)代码>它会突然工作,但只在该功能下工作
谁能解释一下发生了什么事,我做错了什么?将任何目录放入以下JSFIDLE框中以查看:
代码:
var dndbox=$(“.dndbox”)[0];
dndbox.addEventListener(“dragenter”,函数(e){
e、 停止传播();
e、 预防默认值();
},假);
dndbox.addEventListener(“dragover”,函数(e){
e、 停止传播();
e、 预防默认值();
},假);
dndbox.addEventListener(“删除”,函数(e){
e、 停止传播();
e、 预防默认值();
var itemList=e.dataTransfer.items;
var文件=[];
变量遍历=函数(条目)
{
if(entry.isFile){
entry.file(函数(文件){
文件。推送(文件);
});
}else if(entry.isDirectory){
var dR=entry.createReader();
dR.readEntries(函数(条目){
对于(变量i=0;i
您提供给entry.file()
的回调是异步的,因此它在控制台.log(文件)
之后返回每个文件
如果您在第25行输入一个console.log(files)
,您可以看到它在每次回调启动时都得到更新。因此,如果要对所有文件执行某些操作,则需要等待每个回调执行
下面是一个等待所有文件返回的简单示例:
我还建议你退房
编辑:下面是一个使用承诺和函数的示例。这是我第一次使用jQuery实现承诺,所以可能有更好的方法:)
承诺看起来。。。答应呵呵。但是,您只能调用resolve一次,既然函数是递归的,我如何避免这种情况?想在回答的同时提供一个例子吗?为您更新了我的答案,我自己也学到了一些东西!:)非常感谢你!太糟糕了,标准JS没有。when()
我想用这个实现它,但它似乎不可能实现?啊,所以这是一个完全不同的问题!很高兴你知道了。不过我现在还是得去收集文件,做点别的事。哈哈,回到承诺中去吧!
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);