gpt4 book ai didi

javascript - 如何使用嵌套 HTTP 请求更新我的字典?

转载 作者:行者123 更新时间:2023-12-02 22:24:42 25 4
gpt4 key购买 nike

我会尝试尽可能清楚地解释这一点,但这对我来说非常令人困惑,所以请耐心等待。

对于这个项目,我使用 Node.js 以及 Axios 和 Cheerio 模块。

我正在尝试从网上商店(类似于 Amazon/eBay)获取 HTML 数据,并将产品信息存储在字典中。我设法存储了大部分内容(标题、价格、图像),但产品描述位于不同的页面上。为了向该页面发出请求,我使用从第一个请求获得的 URL,因此它们是嵌套的。

第一部分是根据以下请求完成的:

let request = axios.get(url)
.then(res => {
// This gets the HTML for every product
getProducts(res.data);
console.log("Got products in HTML");
})
.then(res => {
// This parses the product HTML into a dictionary of product items
parseProducts(productsHTML);
console.log("Generated dictionary with all the products");
})
.then(res => {
// This loops through the products to fetch and add the description
updateProducts(products);
})
.catch(e => {
console.log(e);
})

我还将提供创建产品对象的方式,因为它可能会澄清我认为出现问题的函数。

function parseProducts(html) {
for (item in productsHTML) {
// Store the data from the first request
const $ = cheerio.load(productsHTML[item]);
let product = {};
let mpUrl = $("a").attr("href");
product["title"] = $("a").attr("title");
product["mpUrl"] = mpUrl;
product["imgUrl"] = $("img").attr("src");
let priceText = $("span.subtext").text().split("\xa0")[1].replace(",", ".");
product["price"] = parseFloat(priceText);

products.push(product);
}
}

问题出在 updateProducts 函数中。如果我事后 console.log 字典,则不会添加描述。我认为这是因为控制台将在添加描述之前进行记录。这是更新函数:

function updateProducts(prodDict) {
for (i in prodDict) {
let request2 = axios.get(prodDict[i]["mpUrl"])
.then(res => {
const $ = cheerio.load(res.data);
description = $("div.description p").text();
prodDict[i]["descr"] = description;
// If I console.log the product here, the description is included
})
}
// If I console.log the product here, the description is NOT included
}

我不知道该尝试什么了,我想这可以通过 async/await 或在代码上设置超时来解决。有人可以帮助我正确更新产品并添加产品说明吗?提前非常感谢您。

最佳答案

要使用 async/await 重构它,可以这样做:

async function fetchAndUpdateProducts() => {
try {
const response = await axios.get(url);

getProducts(response.data);
console.log("Got products in HTML");

parseProducts(productsHTML);
console.log("Generated dictionary with all the products");

await updateProducts(products);
} catch(e) {
console.log(e);
}
}

fetchAndUpdateProducts().then(() => console.log('Done'));

async function updateProducts(prodDict) {
for (i in prodDict) {
const response = await axios.get(prodDict[i]["mpUrl"]);
const $ = cheerio.load(response.data);
description = $("div.description p").text();
prodDict[i]["descr"] = description;
}
}

除非 updateProducts 返回的 promise 已得到解决,否则这不会继续结束对 fetchAndUpdateProducts 的调用。

关于javascript - 如何使用嵌套 HTTP 请求更新我的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59106644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com