Как сделать обещание дождаться завершения всех объектов, а затем нажать на массив?

Функция getURL() создает массив очищенных URL-адресов из исходного URL-адреса. Затем getSubURL() перебирает этот массив и очищает все URL-адреса этих страниц. В настоящее время этот код отлично выводится на консоль, но я не знаю, как дождаться разрешения моих данных, чтобы я мог поместить все собранные данные в один массив. В настоящее время, когда я пытаюсь вернуть сайты, а затем нажимаю на массив, он нажимает только последнее значение. Я считаю, что это ситуация promise.all(map), но я не знаю, как правильно написать ее, не получая ошибки. В идеале мой завершенный цикл можно было бы вызвать в другой функции. Пожалуйста, посмотрите, если можете

const cheerio = require('cheerio');
const axios = require('axios');

let URL = 'https://toscrape.com';

const getURLS = async () => {
  try {
    const res = await axios.get(URL);
    const data = res.data;
    const $ = cheerio.load(data);

    const urlQueue = [];

    $("a[href^='http']").each((i, elem) => {
      const link = $(elem).attr('href');
      if (urlQueue.indexOf(link) === -1) {
        urlQueue.push(link);
      }
    });
    return urlQueue;
  } catch (err) {
    console.info(`Error fetching and parsing data: `, err);
  }
};

const getSubURLs = async () => {
  let urls = await getURLS();

  try {
    //loop through each url in array
    for (const url of urls) {
      //fetch all html from the current url
      const res = await axios.get(url);
      const data = res.data;
      const $ = cheerio.load(data);

      //create object and push that url into that object 
      let sites = {};
      sites.url = url;
      let links = [];
      //scrape all links and save in links array
      $("a[href^='/']").each((i, elem) => {
        const link = $(elem).attr('href');
        if (links.indexOf(link) === -1) {
          links.push(link);
        }
        //save scraped data in object
        sites.links = links;
      });
      // returns list of {url:'url', links:[link1,link2,link3]}
      console.info(sites);
    }
  } catch (err) {
    console.info(`Error fetching and parsing data: `, err);
  }
};
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
471
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не думайте, что в глубине души это проблема, связанная с Promise.

Вам нужно собрать sites в массив, который инициализируется вне цикла. Затем, когда getSubURLs() разрешается, он разрешается в ваш массив:

const getSubURLs = async() => {
  let urls = await getURLS();
  let siteList = [];
  try {
    for (const url of urls) {
      //         :
      //         :
      //         :
      siteList.push(sites);
    }
  } catch (err) {
    console.info(`Error fetching and parsing data: `, err);
  }
  return siteList; // array of objects
};

getSubURLs().then(console.info);

Другие вопросы по теме