Javascript 找出不是';不要被叫

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、 预

我正在尝试使用Google Chrome的文件系统API遍历目录以检索文件

第25行
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);