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);
我的問題:什麼是最好的或者是有在閱讀的最後一個文件回調的最優雅的方式。由於讀取是異步的,所以我不能僅僅依靠範圍規則。那麼,是通過使用計數器,還是我在這裏錯過了一些很酷的方法?謝謝!
好吧,首先我必須遍歷文件以獲取正確的值以傳遞給** inc **方法。但是,那麼如何在計算最後一個文件時進行回調,然後繼續執行其餘代碼? – eudoxyz
@eudoxyz我寫了它,所以你可以很容易地執行'.inc()','.inc()'等,而不是一次全部完成,所以你可以在_read_之前調用它。 「繼續使用代碼」可以在_FileReader的回調的_onload_或_onerror_中完成;基本上你會'if(count.done())nextBitOfCode();' –
謝謝。這是我做的: 'var reader = new FileReader(); reader.onload =功能(EVT){ \t如果( - fileCounter!){ \t \t //做點什麼 \t} \t \t }; fileCounter ++; reader.readAsText(file);' fileCounter是一個全局變量。所以它現在可以工作,但它的前提是第一個_onload_在至少兩個之前的讀取之後被調用。 – eudoxyz