Как превратить рекурсивную функцию в функцию, которая возвращает обещание по завершении - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть рекурсивная функция, которая зацикливается на элементах, я хочу, чтобы консоль регистрировала объект json после завершения рекурсивной функции.это будет лучше всего с обещанием или обратным вызовом?

вот мой текущий код

function productData(elem) {
    if(elem.hasAttribute("itemprop")) {
      const itemProp =  elem.getAttribute("itemprop");
      const itemText = elem.innerText;
      items[itemProp] = itemText;
      console.log("items", items);
    }

    if (elem.hasChildNodes()) {
      Array.from(elem.children).forEach(function (item) {
        productData(item);
      });
    }
  }

  const items = {}
  // Get All Products on the page
  const product = document.querySelectorAll('[itemtype="http://schema.org/Product"]');

  productData(product[0])

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Как упоминалось ранее, вам не нужно обещание для этого конкретного случая. Вы можете завернуть свой предмет в закрытие и вернуть его после завершения рекурсии.

function callProductData(product, output) {

  function productData(elem, items) {
    if (elem.hasAttribute("itemprop")) {
      const itemProp =  elem.getAttribute("itemprop");
      const itemText = elem.innerText;
      items[itemProp] = itemText;
    }

    if (elem.hasChildNodes()) {
      Array.from(elem.children).forEach(function (item) {
        productData(item);
      });
    }
  }

  productData(product, output);
  console.log(output);
}

var product = document.querySelectorAll('[itemtype="http://schema.org/Product"]'[0];
callProductData(product, {});
0 голосов
/ 09 апреля 2019

Вы не делаете ничего асинхронного, вам не нужны ни обратные вызовы, ни обещания.Просто синхронно верните значение.

В вашем текущем коде все, что вам нужно сделать, это console.log(item) после вызова.

Лучшим подходом было бы создание объекта внутри функции и return это, хотя:

function productData(elem, items={}) {
  if (elem.hasAttribute("itemprop")) {
    const itemProp = elem.getAttribute("itemprop");
    const itemText = elem.textContent;
    items[itemProp] = itemText;
  }

  for (const child of elem.children) {
    productData(child, items);
  }
  return items;
//^^^^^^
}

// Get All Products on the page
const productItems = productData(document.querySelector('[itemtype="http://schema.org/Product"]'));
console.log(productItems);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...