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

时间:2019-04-09 20:23:32

标签: javascript recursion callback es6-promise

我有一个循环遍历元素的递归函数,一旦递归函数完成,我想控制台记录json对象。用promise或callback最好吗?

这是我当前的代码

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 :(得分:0)

您没有做任何异步的事情,不需要回调或Promise。只是同步返回一个值。

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

答案 1 :(得分: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, {});