#javascript #node.js #arrays #asynchronous
#javascript #node.js #массивы #асинхронный
Вопрос:
Как следует из названия, я просто хочу получить доступ к данным глобального массива, которые я ввел в getURLs() в моей функции getSubURLs(), чтобы я мог манипулировать данными внутри. Может кто-нибудь сообщить мне, как я могу это сделать? Заранее большое вам спасибо!!
const cheerio = require('cheerio');
const axios = require('axios');
let URL = 'https://toscrape.com';
const urlQueue = [];
const getURLS = async () => {
await axios
.get(URL)
.then((res) => {
const data = res.data;
const $ = cheerio.load(data);
$("a[href^='http']").each((i, elem) => {
const link = $(elem).attr('href');
if (urlQueue.indexOf(link) === -1) {
urlQueue.push(link);
}
});
console.log(urlQueue);
return urlQueue;
})
.catch((err) => {
console.log(`Error fetching and parsing data: `, err);
});
};
const getSubURLs = async () => {
// call urlqueue array here after it finishes being created
}
getURLS();
Комментарии:
1. Зачем использовать асинхронные функции, когда вам действительно нужно, чтобы они ждали друг друга?
2. Честно говоря, я нуб, и я не знаю, как поставить эти данные в очередь и использовать их, чтобы я мог снова очистить. Что вы посоветуете мне сделать?
3. Я не знаю, мне не хватает много информации о том, что вы пытаетесь сделать, но, основываясь на вашем примере, вам, похоже, не нужна асинхронность
4. Я пытаюсь очистить веб-сайт, затем поставить в очередь все URL-адреса с этого сайта, а затем следовать им. В get suburls() я собираюсь взять этот массив и перебирать их, извлекая каждый из их URL-адресов.
Ответ №1:
Не смешивайте async
с .then
синтаксисом, просто await
с результатом:
const cheerio = require('cheerio');
const axios = require('axios');
let URL = 'https://toscrape.com';
const urlQueue = [];
const getURLS = async () => {
try {
const res = await axios.get(URL);
const data = res.data;
const $ = cheerio.load(data);
$("a[href^='http']").each((i, elem) => {
const link = $(elem).attr('href');
if (urlQueue.indexOf(link) === -1) {
urlQueue.push(link);
}
});
console.log(urlQueue);
} catch (err) {
console.log(`Error fetching and parsing data: `, err);
}
};
// in case there's no top-level await
(async () => {
await getURLS();
// do something about urlQueue
})();