如何将递归函数转换为在完成时返回promise的函数

问题描述 投票:0回答:2

我有一个遍历元素的递归函数,我想在递归函数完成后控制日志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])
javascript recursion callback es6-promise
2个回答
0
投票

你没有做任何异步,你既不需要回调,也不需要承诺。只需同步返回一个值。

在您当前的代码中,您需要做的就是在通话后使用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);

0
投票

如前所述,您不需要对此特定案例的承诺。您可以将项目包装在闭包中,并在递归完成后将其传回。

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, {});
© www.soinside.com 2019 - 2024. All rights reserved.