异步/等待订单

时间:2020-04-23 17:26:57

标签: javascript async-await request xml-parsing cheerio

我正在研究一个小型解析器,该解析器同时查看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)
})();

这是我的代码。

  1. 首先,我从xml文件中获取信息。
  2. 我正在解析rss feed中的每一项,并获取链接以获取所需信息。
  3. 当我拥有所需的所有信息时,我会将其推入阵列。
  4. 仅当我完成对每个链接的检查后,才想记录找到的updateItems。

现在,它在执行其他任何操作之前显示一个空数组。 有想法吗?

我愿意对我的代码进行任何改进,我真的开始以业余爱好来编写代码了,

2 个答案:

答案 0 :(得分:0)

您正尝试await的返回值feed.items.forEach(..)。要解决此问题,您可以使用undefined而不是.map(..)并创建一个可以等待的诺言数组,下面是一个示例:

.forEach(..)

答案 1 :(得分:0)

我相信您的代码应如下所示。希望它能工作!

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)
    })();