我有一个循环遍历元素的递归函数,一旦递归函数完成,我想控制台记录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])
答案 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, {});