【发布时间】:2019-03-20 14:55:54
【问题描述】:
我想在异步函数中创建一个新的 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 scrapeAllProducts({ 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 pagesToScrape = await this.extractPagination($);
pagesToScrape.push(`http://www.ubagcollection.com/fr/ubag.html?limit=36`)
for (let index = 0; index < pagesToScraep.length; index++) {
const url = pagesToScrape[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 页提取的产品
每次创建承诺时,我都会记录“进程”,当我的异步函数完成她的工作时,我应该会看到“正在解决”的日志,但这里不是这种情况。
【问题讨论】:
-
能否在
extractProductUrlFromHTML中的reject(error)之前添加console.error(error);以检查是否出现错误?这样做的结果是什么?
标签: javascript node.js cheerio