Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.12.2021, 09:03
Новичок на форуме
Отправить личное сообщение для Gleb Suprun Посмотреть профиль Найти все сообщения от Gleb Suprun
 
Регистрация: 05.12.2021
Сообщений: 4

Получить значение с асинхронной функции для дальнейшего использования в цикле
Суть кода: есть несколько функций, которые парсят сайт, внутри переменные которые получают нужные значения, и при определённом условии они выводят 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();
})
Ответить с цитированием
  #2 (permalink)  
Старый 05.12.2021, 10:35
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,580

Gleb Suprun, ты хочешь в цикле использовать функции getLvl() и getOnline()?

Так их так же можно сделать async и в них делать
const res = await parse()
return res
Ответить с цитированием
  #3 (permalink)  
Старый 05.12.2021, 20:03
Новичок на форуме
Отправить личное сообщение для Gleb Suprun Посмотреть профиль Найти все сообщения от Gleb Suprun
 
Регистрация: 05.12.2021
Сообщений: 4

Да, я хочу использовать в цикле эти функции и понимаю о чем вы, но для начала мне нужно получать значение с этих функций, когда я прописываю
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()
	}
})
Ответить с цитированием
  #4 (permalink)  
Старый 05.12.2021, 20:25
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,580

Сообщение от Gleb Suprun
и понимаю о чем вы
Тогда правильная "расстановка" async/await поможет решить проблему синхронного получения данных...
Ответить с цитированием
  #5 (permalink)  
Старый 05.12.2021, 20:34
Новичок на форуме
Отправить личное сообщение для Gleb Suprun Посмотреть профиль Найти все сообщения от Gleb Suprun
 
Регистрация: 05.12.2021
Сообщений: 4

Хорошо, но я в этом не сильно разбираюсь пока что, читаю документацию, вы можете до словно сказать где что изменить?
Ответить с цитированием
  #6 (permalink)  
Старый 06.12.2021, 04:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,078

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();
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 06.12.2021, 17:30
Новичок на форуме
Отправить личное сообщение для Gleb Suprun Посмотреть профиль Найти все сообщения от Gleb Suprun
 
Регистрация: 05.12.2021
Сообщений: 4

Вы Гений! Спасибо большое!
Большое спасибо, я уже думал сегодня над тем что бы обернуть цикл в async, но дела не позволяли это сделать.

А тут мало того что всё работает, так ещё и код стал короче(понял почему, больше таких ошибок не допущу) и всё красиво, и порядок выполнения стал работать. Спасибо большое!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить значение которые были внесенны в td? Tomat Events/DOM/Window 3 01.08.2018 15:32
Получить значение из асинхронной функции marat2013 Общие вопросы Javascript 2 14.05.2017 21:00
Удалению метаданных в JPEG lorents Библиотеки/Тулкиты/Фреймворки 2 22.04.2012 21:02
Не могу получить значение атрибута DenQ jQuery 9 06.02.2011 14:33
Кросс-браузерные функции B~Vladi Ваши сайты и скрипты 128 01.09.2009 17:11