google-chrome-extension javascript

javascript - 循环遍历节点树并检查节点是否存在,如果不存在,请使用回调或p创建它

发布于 2020-04-14 16:44:58

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

我的代码当前如下所示:

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可以正常工作,但是现在我希望它创建文件夹(如果不存在)。我认为我需要使用一个Promise或回调。创建文件夹的代码很简单:

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

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

查看更多

提问者
bruno
被浏览
26
Brian S 2020-02-04 00:50

看来您应该能够检查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;
  }

}