找出未被调用的函数

时间:2014-03-04 20:33:14

标签: javascript google-chrome

我正在尝试使用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);

1 个答案:

答案 0 :(得分:1)

您提供给entry.file()的回调是异步的,因此它会在 console.log(file)之后为每个文件返回。

如果您在第25行放入console.log(files),则可以看到它在每次回调被触发时都会更新。因此,如果您想对所有文件执行某些操作,则需要等待每个回调执行。

这是一个等待所有文件都返回的简单示例:http://jsfiddle.net/6Tn8W/

我还建议您查看promises

编辑:这是使用promises和when()函数的示例。这是我第一次使用jQuery实现promise,所以可能有更好的方法来实现这一点:)

http://jsfiddle.net/Lsuz2/