Получить значение с асинхронной функции для дальнейшего использования в цикле
Суть кода: есть несколько функций, которые парсят сайт, внутри переменные которые получают нужные значения, и при определённом условии они выводят true/false.
Суть дальнейшей задачи: нужно сделать цикл в котором будут участвовать функции, а точнее их конечные значения, для того что бы по ним сделать фильтр Проблема: Не могу или не знаю как вынести конечное значение вывести конечное значение для дальнейшего использования.
const axios = require('axios');
const cheerio = require('cheerio');
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
readline.question('Введите ID пользователя: ', function (answer) {
let userID = answer;
//LVL
function getLvl(userLvl) {
const parse = async () => {
const getHTML = async (url) => {
const { data } = await axios.get(url)
return cheerio.load(data)
}
const $ = await getHTML('https://steamcommunity.com/profiles/' + String(userID));
let userLvl = $('span.friendPlayerLevelNum').eq(0).text();
if ((Number(userLvl) === 0)) {
userLvl = true;
} else {
userLvl = false;
}
console.log(userLvl);
}
parse();
}
getLvl();
//ONLINE
function getOnline(userOnline) {
const parse = async () => {
const getHTML = async (url) => {
const { data } = await axios.get(url)
return cheerio.load(data)
}
const $ = await getHTML('https://steamcommunity.com/profiles/' + String(userID));
let userOnline = $('div.profile_in_game_header').eq(0).text();
if ((String(userOnline) === 'Currently Online')) {
userOnline = true;
} else if ((String(userOnline) === 'Currently In-Game')) {
userOnline = true;
} else if ((String(userOnline) === 'In non-Steam game')) {
userOnline = true;
} else {
userOnline = false;
}
console.log(userOnline);
}
parse();
}
getOnline();
})
|
Gleb Suprun, ты хочешь в цикле использовать функции getLvl() и getOnline()?
Так их так же можно сделать async и в них делать const res = await parse() return res |
Да, я хочу использовать в цикле эти функции и понимаю о чем вы, но для начала мне нужно получать значение с этих функций, когда я прописываю
console.log(getLvl());я получаю undefined, а когда я пытаюсь после 28 строки вывести console.log(parse());получаю 2: Promise { <pending> }, при том что console.log(userLvl);на 26 строке я заменил на return userLvl; В итоге мне нужно на данный момент получить значения из функций.
const axios = require('axios');
const cheerio = require('cheerio');
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
readline.question('Введите ID пользователя: ', function (answer) {
let userId = answer;
for (let i = 0n; i <= 0n; ++i) {
let userID = BigInt(userId) + i;
//LVL
function getLvl(userLvl) {
const parse = async () => {
const getHTML = async (url) => {
const { data } = await axios.get(url)
return cheerio.load(data)
}
const $ = await getHTML('https://steamcommunity.com/profiles/' + String(userID));
userLvl = $('span.friendPlayerLevelNum').eq(0).text();
if ((Number(userLvl) === 0)) {
userLvl = true;
} else {
userLvl = false;
}
// console.log(userLvl);
return userLvl;
}
parse();
}
getLvl()
//ONLINE
function getOnline() {
const parse = async () => {
const getHTML = async (url) => {
const { data } = await axios.get(url)
return cheerio.load(data)
}
const $ = await getHTML('https://steamcommunity.com/profiles/' + String(userID));
let userOnline = $('div.profile_in_game_header').eq(0).text();
if ((String(userOnline) === 'Currently Online')) {
userOnline = true;
} else if ((String(userOnline) === 'Currently In-Game')) {
userOnline = true;
} else if ((String(userOnline) === 'In non-Steam game')) {
userOnline = true;
} else {
userOnline = false;
}
// console.log(userOnline);
return userOnline;
}
parse()
}
getOnline()
}
})
|
Цитата:
|
Хорошо, но я в этом не сильно разбираюсь пока что, читаю документацию, вы можете до словно сказать где что изменить?
|
const axios = require('axios');
const cheerio = require('cheerio');
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
const util = require('util');
const question = util.promisify(readline.question).bind(readline);
const getHTML = async (url) => {
const { data } = await axios.get(url)
return cheerio.load(data)
}
async function questionExample() {
const userIdInput = await question('Введите ID пользователя: ');
for (let i = 0n; i <= 0n; ++i) {
let userID = BigInt(userIdInput) + i;
const $ = await getHTML('https://steamcommunity.com/profiles/' + String(userID));
//LVL
let userLvl = $('span.friendPlayerLevelNum').eq(0).text();
if ((Number(userLvl) === 0)) {
userLvl = true;
} else {
userLvl = false;
}
//ONLINE
let userOnline = $('div.profile_in_game_header').eq(0).text();
if ((String(userOnline) === 'Currently Online')) {
userOnline = true;
} else if ((String(userOnline) === 'Currently In-Game')) {
userOnline = true;
} else if ((String(userOnline) === 'In non-Steam game')) {
userOnline = true;
} else {
userOnline = false;
}
}
}
questionExample();
|
Вы Гений! Спасибо большое!
Большое спасибо, я уже думал сегодня над тем что бы обернуть цикл в async, но дела не позволяли это сделать.
А тут мало того что всё работает, так ещё и код стал короче(понял почему, больше таких ошибок не допущу) и всё красиво, и порядок выполнения стал работать. Спасибо большое!:thanks: |
| Часовой пояс GMT +3, время: 03:51. |