[英]How to await a function in javascript that has a promise inside?
[英]await function inside a promise
我想在异步函数中创建一个新的 Promise。 在这个 Promise 中,我想调用另一个异步函数,该函数将调用一些异步内容(从网页中删除 HTML)。
这是我的代码:
async extractProductUrlFromHTML(html) {
const products = html(`h2.product-name`).toArray();
let extracted = [];
let promises = [];
for (let index = 0; index < products.length; index++) {
const element = products[index];
let productUrl = element.children[0].attribs.href;
const productProm = new Promise(async (resolve, reject) => {
try {
console.log("process");
const product = await this.getProductInfos(productUrl);
console.log("resolving")
resolve(product);
} catch (error) {
reject(error)
}
})
promises.push(productProm);
}
Promise.all(promises).then((prods) => {
console.log("promises ok", prods)
extracted.push(prods);
return (extracted);
})
}
这是函数的调用方式:
async scrapAllProducts({ request, response }) {
let extractedProducts = []
//get the html page
const html = await AxiosService.getHTML('http://www.ubagcollection.com/fr/ubag.html?limit=36')
const $ = cheerio.load(html);
let pagesToScrap = await this.extractPagination($);
pagesToScrap.push(`http://www.ubagcollection.com/fr/ubag.html?limit=36`)
for (let index = 0; index < pagesToScrap.length; index++) {
const url = pagesToScrap[index];
let html = await AxiosService.getHTML(url);
const $ = cheerio.load(html);
console.log("start extraction")
const products = await this.extractProductUrlFromHTML($);
console.log('product extracted from page :' + index)
extractedProducts.push(products);
}
console.log("all is extracted", extractedProducts)
... bla bla bla
我的问题是,在创建所有承诺的那一刻,我可以在程序完成工作之前看到“从页面提取的产品:...”...
这是我运行脚本时可以看到的序列:
开始提取流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程流程产品提取页面:1
每次创建承诺时,我都会记录“进程”,当我的异步函数完成她的工作时,我应该会看到“正在解决”的日志,而这里的情况并非如此。
我认为你可以稍微清理一下你的承诺。 您不需要将getProductInfos
包装在承诺中。 你正在await
-ing 它,所以我假设它返回一个承诺。 没有必要等待一个承诺只是为了将它包装在另一个承诺中并解决它。
也许更像:
async extractProductUrlFromHTML(html) {
try {
const products = html(`h2.product-name`).toArray() || [];
let extracted = [];
let promises = products.map(element => {
let productUrl = element.children[0].attribs.href;
return this.getProductInfos(productUrl); // assuming getProductInfos returns a promise
});
const results = await Promise.all(promises); // need to await the Promise.all
extracted.push(results); // Do you really want to push the array of results into another array? You'll have [[productInfo1, productInfo2, ...]]
return extracted;
} catch (e) {
console.error(e);
}
}
好的,我解决了我的问题。 我放了一个代码示例,也许它可能对某人有用。
let extracted = [];
let promises = [];
for (let index = 0; index < products.length; index++) {
const element = products[index];
let productUrl = element.children[0].attribs.href;
const productProm = new Promise(async (resolve, reject) => {
try {
await utils.timeout(utils.getRandomInt(1000,4000))
const product = await this.getProductInfos(productUrl);
resolve(product);
} catch (error) {
reject(error)
}
})
promises.push(productProm);
}
let prods = await Promise.all(promises)
extracted.push(prods);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.