Async / Await order [duplicate]

问题描述 投票:0回答:2

我正在研究一个小型解析器,该解析器同时查看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提要中解析每个项目,获取链接以获取我需要的信息。
  3. [当我拥有所需的所有信息时,我正在将该项目推送到我的数组中。
  4. 仅当我完成检查EVERY链接时,我才想记录我发现的updatedItems。

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

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

javascript async-await request xml-parsing cheerio
2个回答
0
投票

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

await Promise.all(await feed.items.map(item => {
  return request(item.link, (err, res, html) => {
    ..
  });
});

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)
    })();
© www.soinside.com 2019 - 2024. All rights reserved.