成功完成递归后回调

时间:2014-03-31 01:28:42

标签: javascript recursion webkit file-traversal

我正在关注文件夹上传Folder Drag Drop

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 个答案:

答案 0 :(得分:0)

当你的traverseFileTree没有第三个参数时,你应该如何做到这一点,这可能是回调?

function traverseFileTree(item, path, CALLBACK){...}

此外,该功能虽然未分配给参数,但在该功能内部甚至无法调用。你期望它如何运行?

您需要添加一些逻辑来向您的函数指示它已访问所有节点。 然后你调用回调。:

function traverseFileTree(item, path, callback){
  ...
  if(allNodesAccessed) callback.call(null);
  ...
}