Javascript:递归获取数据以填充 html 文本

免责声明:这是我的第一个问题,我是 JavaScript 新手。

我试图通过使用 API 获取数据来填充一些 html 文本元素。这个 API 返回一个 JSON 对象,其中包含我需要的一些文本,但也返回一些我需要然后从中获取其他数据的 API URL。其中一些 URL 保存在数组中。因此,我需要获取一个 JSON 对象,遍历它,同时有时存储字符串,有时获取包含我需要的剩余文本的其他 JSON。我在处理承诺和异步执行时遇到了很多麻烦。我不知道如何等待一个 promise 完成,因此返回的数据一直未定义。

async function GetData(address) {
    const response = await fetch(address);
    const json = await response.json();
    return json;
}
async function CleanData(origData) {
    Object.entries(origData).forEach(async ([key,value]) => {
        // look for arrays
        if (Array.isArray(value)) {
            value.forEach(async (element,i) => {
                // look for links inside arrays
                if (element.indexOf("https") != -1) {
                    let newData = await GetData(element);
                    // replace link with name or title
                    if (newData["name"] !== undefined) {
                        origData[key][i] = newData["name"]
                    } else if (newData["title"] !== undefined) {
                        origData[key][i] = newData["title"];
                    }
                }
            });
        }
        // look for links and replace with name
        if (value.indexOf("https") != -1) {
            let newData = await GetData(value);
            origData[key] = newData["name"];
        }
    })
    return origData;
}
function PopulateFields(fieldData) {
    nameId.innerText = fieldData["name"];
    valueIds.forEach(node => {
        const nodeId = node.id;
        node.innerText = fieldData[nodeId];
    });
}
document.getElementById("button").addEventListener(
"click",async () => {               // also tried without async using .then()
    let data = await GetData(ApiUrl);
    data = await CleanData(data);           
    PopulateFields(data);
}
a4870126sdo 回答:Javascript:递归获取数据以填充 html 文本

切换到普通循环 (for...of) 而不是 forEach。它可能会解决您所有的问题。从来没有一个很好的理由使用 forEach,它只是 jQuery 时代的遗留物。

现在的问题是您将异步函数传递给 forEach(),但无法等待 那些。通过使用常规循环,您只需在循环内等待,“正确”的事情就会发生。

本文链接:https://www.f2er.com/13987.html

大家都在问