Задать вопрос
@MarkJSexton

Как распечатать массив после завершения асинхронной операции?

Добрый день, изучаю асинхронное программирование, да пока на данный момент нету четкого представления, но я работаю на ситуацией.

Суть проблемы заключается в том, что мне нужно расспечать массив "newsFeed" по завершению всего цикла методов.

Концепция идеи: имеется входной массив со ссылками на RSS ленты разных источников, асинхронная функция получает массив, парсит все это дело и добавляет во выходной массив 'newsFeed' и по окончанию операции нужно распечатать итоговое состояние массива "newsFeed"

Вот с последним пунктом проблема...

const axios = require('axios')
const xml2js = require('xml2js')

const parser = new xml2js.Parser()

const NULL = 0
const SECOND = 2

// Ну концепция данной идеи заключается в том, что если появляется новый канал, то мы его просто добавляем во входной массив,
let rssChannels = [
  'https://mos.ru/rss',  
  'https://lenta.ru/rss/news',  
]

// Итоговый, агрегационный массив с новостями со всех полученных источников из входного массива rssChannels
let newsFeed = []

const delay = () => {
  return new Promise(resolve => setTimeout(resolve, 300))
}

// Подключение к RSS ленте, получаем XML и приобразуем из него в JS объекты, затем добавляем в агрегационный массив newsFeed
const getChannelFeed = async (url) => {
  await delay()
  axios.get(url)
    .then(res => parser.parseStringPromise(res.data)
      .then(res => newsFeed.push(res.rss.channel[NULL].item))
      .catch(err => console.log('ERROR: Unable to parse received XML'))
    ).catch(err => console.log('ERROR: Unable to establish URL connection'))
}

const processArray = async (rssChannels) => {
  const promises = rssChannels.map(getChannelFeed)
  await Promise.all(promises)
  console.log(newsFeed)
}

processArray(rssChannels)


Здесь можно запустить код
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@Aves
const axios = require('axios');
const xml2js = require('xml2js');

const parser = new xml2js.Parser();

const NULL = 0;
const SECOND = 2;

// Ну концепция данной идеи заключается в том, что если появляется новый канал, то мы его просто добавляем во входной массив,
const rssChannels = [
  'https://mos.ru/rss',
  'https://lenta.ru/rss/news',
];

// Итоговый, агрегационный массив с новостями со всех полученных источников из входного массива rssChannels
const newsFeed = [];

// Подключение к RSS ленте, получаем XML и приобразуем из него в JS объекты, затем добавляем в агрегационный массив newsFeed
const getChannelFeed = url =>
  axios.get(url).then(res => {
    return parser.parseStringPromise(res.data)
      .then(res => newsFeed.push(...res.rss.channel[NULL].item))
      .catch(err => console.log('ERROR: Unable to parse received XML'));
  })
    .catch(err => console.log('ERROR: Unable to establish URL connection'));


// Заполняем выходной массив контентов
const someFoo = rssChannels =>
  Promise.all(rssChannels.map(item => getChannelFeed(item)));


someFoo(rssChannels).then(item => console.log(newsFeed));

Вообще, кривовато всё как-то.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 11:57
500 руб./в час
18 дек. 2024, в 11:54
2000 руб./за проект