2013-08-04 17 views
0

我正在創建一個可以遞歸接受文件和文件夾的「拖放」字段。這是代碼:FileReader:讀取多個項目;如何在閱讀最後一個時設置回調?

function traverseFileTree(item) { 
    if (item.isFile) { 
     item.file(function(file) { 
      var reader = new FileReader(); 
      reader.onload = function(evt) { 
       // do something... 
      }; 
      reader.readAsText(file); 
     }); 
    } else if (item.isDirectory) { 
     var dirReader = item.createReader(); 
     dirReader.readEntries(function(entries) { 
      for (var i = 0; i < entries.length; i++) { 
       traverseFileTree(entries[i]); 
      } 
     }); 
    } 
} 

var dropZone = document.getElementById("drop_zone"); 
dropZone.addEventListener("drop", function(evt) { 
    var items = event.dataTransfer.items; 
    for (var i = 0; i < items.length; i++) { 
     var item = items[i].webkitGetAsEntry(); 
     if (item) { 
      traverseFileTree(item); 
     } 
    } 
}, false); 

我的問題:什麼是最好的或者是有在閱讀的最後一個文件回調的最優雅的方式。由於讀取是異步的,所以我不能僅僅依靠範圍規則。那麼,是通過使用計數器,還是我在這裏錯過了一些很酷的方法?謝謝!

回答

0

你可以做某種計數器,並檢查它的的onload功能(你可能需要有它在的onerror,太)。

function CountDown() { 
    this.remain = 0; 
} 
CountDown.prototype.inc = function (x) { 
    if (undefined === x) x = 1; 
    this.remain += +x; 
    return this; 
} 
CountDown.prototype.done = function() { 
    if (0 >= --this.remain) { 
     this.remain = 0; 
     return true; 
    } 
    return false; 
} 

var count = new CountDown().inc(3); // 3 files 
// in the onload for each, test 
count.done(); // false 
count.done(); // false 
count.done(); // true 
count.done(); // true 
count.done(); // true, etc 

當然,如果您正確確定變量的範圍,也可以在沒有整個對象封裝的情況下在代碼中完成此操作。

+0

好吧,首先我必須遍歷文件以獲取正確的值以傳遞給** inc **方法。但是,那麼如何在計算最後一個文件時進行回調,然後繼續執行其餘代碼? – eudoxyz

+0

@eudoxyz我寫了它,所以你可以很容易地執行'.inc()','.inc()'等,而不是一次全部完成,所以你可以在_read_之前調用它。 「繼續使用代碼」可以在_FileReader的回調的_onload_或_onerror_中完成;基本上你會'if(count.done())nextBitOfCode();' –

+0

謝謝。這是我做的: 'var reader = new FileReader(); reader.onload =功能(EVT){ \t如果( - fileCounter!){ \t \t //做點什麼 \t} \t \t }; fileCounter ++; reader.readAsText(file);' fileCounter是一個全局變量。所以它現在可以工作,但它的前提是第一個_onload_在至少兩個之前的讀取之後被調用。 – eudoxyz

相關問題