Получить значение с асинхронной функции для дальнейшего использования в цикле
Суть кода: есть несколько функций, которые парсят сайт, внутри переменные которые получают нужные значения, и при определённом условии они выводят 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, время: 22:03. |