Рекурсивно l oop через дерево узлов и проверить, существует ли узел, если нет, создать его с помощью обратного вызова или обещания - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу написать функцию, которая рекурсивно просматривает дерево узлов и в зависимости от того, существует ли определенный узел, либо регистрирует его значения, либо создает отсутствующий узел. Это должно быть довольно просто, но я не могу обернуть голову вокруг него.

мой код в настоящее время выглядит так:

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;
    }
  }
}

Он работает нормально для вывода идентификатора узла, если папка уже существует, но теперь я хочу, чтобы она создала папку, если ее нет. Я решил, что мне нужно использовать обещание или обратный звонок. Код для создания папки прост:

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

Как и где бы я интегрировал это в мою текущую функцию? (init() вызывается при первой установке приложения.)

1 Ответ

1 голос
/ 03 февраля 2020

Похоже, вы должны быть в состоянии проверить значение hasFolder в обратном вызове и добавить папку, если это необходимо. Примерно так:

chrome.bookmarks.getTree(function(itemTree){

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

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

Я не знаком с API закладок Chrome, поэтому не могу сказать, будет ли он жаловаться на то, что вы изменили коллекцию закладок внутри обратного вызова 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;
  }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...