2014-03-04 89 views
2

我試圖遍歷目錄以使用Google Chrome的Filesystem API檢索文件。找出沒有被調用的函數

在線25 files.push(file);,試圖填充files數組似乎並沒有被調用。但是,如果我用console.log(file);替換它,它會突然生效,但只能使用該功能。

任何人都可以解釋發生了什麼,我做錯了什麼?降大任DIR成以下的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

您提供entry.file()回調是異步的,所以它返回的console.log(file)後每個文件

如果您在第25行中輸入console.log(files),則可以看到每次回調被觸發時它都會更新。所以如果你想對所有文件做些什麼,你需要等待每個回調執行。

下面是等待所有文件返回的簡單示例:http://jsfiddle.net/6Tn8W/

我也推薦檢查promises

編輯:這裏是一個使用promise和when()函數的例子。這是我第一次使用jQuery的執行承諾的,所以有可能是一個更好的方式來做到這一點:)

http://jsfiddle.net/Lsuz2/

+0

承諾......看起來前途嘿嘿。但是你只能調用一次解析,我怎麼能解決這個問題,因爲函數是遞歸的?謹慎提供一個例子以及你的答案? – Tek

+0

爲我更新了我的答案,也自己學了一些東西! :) – user1234

+0

非常感謝!太糟糕的標準JS沒有'.when()'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 我想用它來實現它,但它似乎不可能? – Tek