停止并稍后继续递归树遍历

时间:2016-06-25 23:27:31

标签: javascript recursion google-apps-script breadth-first-search

我正在使用广度优先深度优先(?)搜索来映射文件和文件夹。我还记录了映射数据,并构建了一个显示文件夹及其文件/详细信息的JSON结构。

我想在任意点停止执行,保存JSON数据,然后重新启动执行,并从我停止的地方继续。这是我的代码(这是Google Apps脚本,基本上是美化云执行的JavaScript)。

function MapDrive() {      
  var structure = {};
  try {    
    var parentFolder = DriveApp.getRootFolder();

    getChildFolders(parentFolder, structure, {path: parentFolder.getName()});
    var blob = CreateJSONBlob(structure);
    MailApp.sendEmail('myEmail', 'Folder Tree', 'Drive Map Attached' ,{ attachments: [blob]})
  } catch (e) {
    Logger.log(e.toString());   
  }
}

//Recursive breadth-first folder and file mapping
function TraverseDriveTree(parent, structure, path){
  if(CheckExecutionTime()){
    var childFolders = parent.getFolders();
    var parentName = parent.getName(); 

    //If there is no parent path add it
    if(typeof path[parentName] === 'undefined'){
      path[parentName] = {path: path.path};
    }

    //If parent doe snot exist in structure, then add it and it's files
    if(typeof structure[parentName] === 'undefined'){
      structure[parentName] = {};
      structure[parentName]['files'] = GetFilesInfo(parent.getFiles(), path[parentName].path);
    }  

    while (childFolders.hasNext()) {    
      var childFolder = childFolders.next();
      var childfolderName = childFolder.getName();  
      path[parentName][childfolderName] = {path: path[parentName].path + " > " +childfolderName};

      if(typeof structure[parentName][childfolderName] === 'undefined'){
        structure[parentName][childfolderName] = {};
      }

      structure[parentName][childfolderName]["files"] = GetFilesInfo(childFolder.getFiles(), path[parentName][childfolderName].path);

      // Recursive call for any sub-folders
      TraverseDriveTree(childFolder, structure[parentName][childfolderName], path[parentName]);    
    }     

  } else {
    SaveCurrentState(structure, parent, path)
  }
}

我不需要帮助保存JSON或类似的东西。我需要帮助弄清楚如何在停止后继续递归树遍历,并继续从我离开的位置向数据结构中添加项目。

1 个答案:

答案 0 :(得分:0)

AFAIK没有JavaScript运行时为您提供了一种操作调用堆栈的低级访问权限,您可以根据需要进行操作。

最好的办法是使用自己的堆栈并完全跳过递归。看起来你正在做一个预订tree traversal,它可以在你做的时候递归完成,但也可以使用循环和堆栈迭代完成 - 并且更容易保存和恢复状态一个循环而不是执行调用堆栈。

相关问题