我有一个遍历元素的递归函数,我想在递归函数完成后控制日志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])
你没有做任何异步,你既不需要回调,也不需要承诺。只需同步返回一个值。
在您当前的代码中,您需要做的就是在通话后使用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);
如前所述,您不需要对此特定案例的承诺。您可以将项目包装在闭包中,并在递归完成后将其传回。
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, {});