我正在研究一个小型解析器,该解析器同时查看rss.xml文件并从我在xml项内找到的链接中提取信息。
我能够获得所需的所有信息,现在我唯一的问题是我不太了解Async / Await的工作方式。
const Parser = require('rss-parser');
const cheerio = require('cheerio')
const request = require('request');
const parser = new Parser(
{
customFields: {
item: [
['media:thumbnail', 'preview']
]
}
}
);
const URL = 'https://www.dimensions.guide/element/rss.xml';
const updatedItems = [];
var updatedItem = {};
(async () => {
const feed = await parser.parseURL(URL);
await feed.items.forEach(item => {
request(item.link, (err, res, html) => {
if(!err && res.statusCode == 200){
const $ = cheerio.load(html);
updatedItem = {
"title": $('h1.title-text-hover-tag').text(),
"category": $('.header-wrapper-lower-links > a.parent-link').first().text(),
"subCategory": $('.header-wrapper-lower-links > a.parent-link').last().text(),
"link": item.link,
"preview": item.preview.$.url,
"lastUpdate": item.pubDate,
}
updatedItems.push(updatedItem)
}
});
});
console.log(updatedItems)
})();
这是我的代码。
现在,它在执行其他任何操作之前显示一个空数组。有任何想法吗?
我愿意对我的代码进行任何改进,我真的开始以业余爱好来编写代码,并且不太了解
您正在尝试await
返回feed.items.forEach(..)
的返回值,即undefined
。要解决此问题,您可以使用.map(..)
而不是.forEach(..)
并创建一个可以等待的诺言数组,下面是一个示例:
await Promise.all(await feed.items.map(item => {
return request(item.link, (err, res, html) => {
..
});
});
我相信您的代码应如下所示。希望它能工作!
const Parser = require('rss-parser');
const cheerio = require('cheerio')
const request = require('request');
const parser = new Parser(
{
customFields: {
item: [
['media:thumbnail', 'preview']
]
}
}
);
const URL = 'https://www.dimensions.guide/element/rss.xml';
const updatedItems = [];
var updatedItem = {};
function doRequest(url) {
return new Promise(function (resolve, reject) {
request(url, function (error, res, body) {
if (!error && res.statusCode == 200) {
resolve([error, res, body]);
} else {
reject(error);
}
});
});
}
(async () => {
const feed = await parser.parseURL(URL);
feed.items.forEach(async (item) => {
const [err, res, html] = await doRequest(item.link);
if(!err && res.statusCode == 200){
const $ = cheerio.load(html);
updatedItem = {
"title": $('h1.title-text-hover-tag').text(),
"category": $('.header-wrapper-lower-links > a.parent-link').first().text(),
"subCategory": $('.header-wrapper-lower-links > a.parent-link').last().text(),
"link": item.link,
"preview": item.preview.$.url,
"lastUpdate": item.pubDate,
}
updatedItems.push(updatedItem)
}
});
console.log(updatedItems)
})();