首页 > 解决方案 > 递归循环遍历节点树并检查节点是否存在,如果不存在,则使用回调或承诺创建它

问题描述

我想编写一个递归浏览节点树的函数,并根据某个节点是否存在,记录其值或创建丢失的节点。这应该相当简单,但我似乎无法理解它。

我的代码目前看起来像这样:

let folderName = 'My Folder Name';

function init() {
  let hasFolder = false;
  let folderId = '';

  chrome.bookmarks.getTree(function(itemTree){
    itemTree.forEach(function(item){
      processNode(item);
    });
  });

  function processNode(node) {
    // recursively process child nodes
    if (node.children) {
      node.children.forEach(function(child) { 
        processNode(child); 
      });
    }

    if (node.title == folderName) { 
      console.log(folderName + ' folder already exists: ID is ' + node.id);
      hasFolder = true;
      folderId = node.id;
    }
  }
}

如果文件夹已经存在,则输出节点 ID 可以正常工作,但现在我希望它在不存在的情况下创建文件夹。我想我需要使用承诺或回调。创建文件夹的代码很简单:

function createFolder() {
  chrome.bookmarks.create({
    title: appName,
    url: null
  }, onBookmarkAdded)
}

我将如何以及在何处将其集成到我当前的功能中?(init()在首次安装应用程序时调用。)

标签: javascriptgoogle-chrome-extension

解决方案


似乎您应该能够检查hasFolder回调中的值并在必要时添加文件夹。像这样的东西:

chrome.bookmarks.getTree(function(itemTree){

  itemTree.forEach(function(item){
    processNode(item);
    if(hasFolder) return;
  });

  if(!hasFolder){
    createFolder();
  }
});

我不熟悉 Chrome 的书签 api,所以我不能说它是否会抱怨你在getTree回调中修改书签集合,但如果不是,这种方法应该可以工作。

另外,附带说明一下,为了提高效率,您可能希望在forEach找到文件夹后返回,以减少不必要的循环(已在上面的代码中添加)。

function processNode(node) {
  // recursively process child nodes
  if (node.children) {
    node.children.forEach(function(child) { 
      processNode(child); 
      if(hasFolder) return;
    });
  }

  if (node.title == folderName) { 
    console.log(folderName + ' folder already exists: ID is ' + node.id);
    hasFolder = true;
    folderId = node.id;
  }

}


推荐阅读