Обратный звонок при успешном завершении рекурсии
Я слежу за перетаскиванием папки для загрузки в папку.
function onDrop(e) {
e.preventDefault();
e.stopPropagation();
var items = e.dataTransfer.items;
for (var i=0; i<items.length; i++) {
var item = items[i].webkitGetAsEntry();
if (item) {
traverseFileTree(item, path="", function(){
//Recursion Complete (Not invoked)
});
}
}
}
var setFlag = true;
function traverseFileTree(item, path, callback) {
path = path || "";
if (item.isFile) {
item.file(function(file) {
if(setFlag)callback(null);
});
} else if (item.isDirectory) {
var dirReader = item.createReader();
dirReader.readEntries(function(entries) {
for (var i=0; i<entries.length; i++)
if(entries[i].isDirectory)setFlag = false;
for (var i=0; i<entries.length; i++) {
traverseFileTree(entries[i], path + item.name + "/",callback);
}
});
}
}
Вышеуказанная проверка состояния для завершения рекурсии не работает. Так как количество вложенных файлов и папок варьируется, любой эффективный метод проверки конца рекурсии.
1 ответ
Как ты должен это делать, когда твой traverseFileTree
не имеет третьего параметра, который будет обратным вызовом?
function traverseFileTree(item, path, CALLBACK){...}
Кроме того, эта функция, хотя и не назначается параметру, даже не вызывается внутри этой функции. Как вы ожидаете, что это будет работать?
Вам нужно добавить некоторую логику, чтобы указать вашей функции, что она получила доступ ко всем узлам. Тогда вы перезвоните.
function traverseFileTree(item, path, callback){
...
if(allNodesAccessed) callback.call(null);
...
}