javascript - 异步方法总是返回 undefined
问题描述
我无法解决这个问题,所以我在这里问:
这是异步函数,如您所见,它返回一个数组。但它返回一个未定义的值。
async function scrape(pageURL) {
var dealArray = [];
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(pageURL);
await page.waitForSelector('div.s-item-container');
const dealsElements = await page.$$('div.s-item-container');
for(deal of dealsElements) {
let dealTitleElement = await deal.$('div.s-item-container a.s-access-detail-page');
let dealTitleValue = await (await dealTitleElement.getProperty('title')).jsonValue();
let dealPriceElement= await deal.$('div.s-item-container span.a-color-price');
let dealPriceValue = await (await dealPriceElement.getProperty('textContent')).jsonValue();
let dealReviewsElement = await deal.$('div.s-item-container .a-icon-star');
let dealLinkValue = await (await dealTitleElement.getProperty('href')).jsonValue() + '&tag=dragonstv-21';
let dealReviewsClass = await (await dealReviewsElement.getProperty('className')).jsonValue();
let dealReviewsValue;
if(dealReviewsClass) {
let starValue = dealReviewsClass.substring(26);
if(starValue.indexOf('-') === -1) {
dealReviewsValue = starValue;
} else {
let stars = starValue.replace('-', '.');
dealReviewsValue = stars;
}
}
dealArray.push({
"title": dealTitleValue,
"price": dealPriceValue,
"reviews": dealReviewsValue + "/5.0",
"link": dealLinkValue,
"store": "Amazon",
});
}
return Promise.resolve(dealArray);
} catch(e) {
console.error('Error: ' + e);
}
}
这就是我所说的:
scrape('working link').then((data) => {
console.log(data) // result: undefined
}
仅当我在函数之外声明变量并且函数不返回任何内容而仅更改数组内容时,它才有效。
解决方案
如所写,您的函数必须返回一个数组(空或其他)。如果它正在返回undefined
,那么您正在生成一个异常,并且应该通过您的 catch 语句在控制台中看到一个异常。如果您没有看到它,您可以尝试删除 try/catch 并查看出现了哪些异常。
推荐阅读
- roomle - 如果一个物体可以通过一个角落进入另一个房间,那么 Roomle 是否可能?
- java - 找不到 Spring kafka AVRO 生成的类
- python - 在从实例分割掩码中提取的二进制对象掩码图像中提取感兴趣对象的二进制边界图像
- javascript - 下一个 JS 和 Cloudinary,图像未加载
- python - 创建 gensim 词汇表时,为什么会出现“解码到 str:需要类似字节的对象,找到列表”错误?
- r - 如何在ggplot2的分组箱图中定位或对齐平均线?
- ruby - 在 RuboCop 中每行强制一个参数
- kotlin - Kotlin SharedFlow - 如何订阅?
- python - 如果某个较低级别的索引不存在,则删除所有较高级别的多索引行
- javascript - 类型错误:firebase__WEBPACK_IMPORTED_MODULE_11__.auth 不是函数