Как мне вернуть значение, которое я очистил с помощью pupeteer вне моей асинхронной функции

#javascript #web-scraping #puppeteer #telegram #telegraf

Вопрос:

Я кодирую телеграмм-бота с помощью telegraph, и весь день у меня возникали проблемы. То, что я пытался сделать, — это заставить моего бота telegram получать разделенную удерживаемую сумму и значение для печати значения каждого токена, но я не могу понять, как вернуть значение боту. Кроме того, он создает исключение, когда я пытаюсь запустить его таким образом, если я оставляю бота вне функции. Я отключил ссылки по соображениям конфиденциальности, но цифры не имеют значения, так как они правильно делятся.

 const { Telegraf } = require('telegraf')
const puppeteer = require("puppeteer-extra")
const stealth = require("puppeteer-extra-plugin-stealth")()
const anon = require(`puppeteer-extra-plugin-anonymize-ua`)()
puppeteer.use(stealth).use(anon);

(async () => {

  const bot = new Telegraf('my telegraf bot ID, can't post it')

    //the token URL
  let tokenUrl = 'https://bscscan.com/tokenholdings?a=0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';

  let browser = await puppeteer.launch();
  let page = await browser.newPage();

  await page.goto(tokenUrl, { waitUntil: 'networkidle2' });

  let tokenPrice = await page.evaluate(() => {

    let amount = document.querySelector('div[class="table-responsive mb-2 mb-md-0"]>table>tbody> tr:nth-child(4) > td:nth-child(4)').innerText;
    //console.log(amount);
    amount = Number(amount.replace(`,`, ``));

    let holdingPrice = document.querySelector('span[class="h5 mr-1 mb-0"]').innerText;
    //console.log(holdingPrice);
    holdingPrice = Number(holdingPrice.replace(`
 #javascript #web-scraping #puppeteer #telegram #telegraf



Вопрос:

Я кодирую телеграмм-бота с помощью telegraph, и весь день у меня возникали проблемы. То, что я пытался сделать, - это заставить моего бота telegram получать разделенную удерживаемую сумму и значение для печати значения каждого токена, но я не могу понять, как вернуть значение боту. Кроме того, он создает исключение, когда я пытаюсь запустить его таким образом, если я оставляю бота вне функции. Я отключил ссылки по соображениям конфиденциальности, но цифры не имеют значения, так как они правильно делятся. , ``).replace(`,`, ``).replace(`,`, ``).replace(`,`, ``)); let tokenCurrentPrice = holdingPrice / amount; return tokenCurrentPrice; }); console.log(tokenPrice); })(); //bot.command('price', (ctx) => ctx.reply(tokenPrice))

Ответ №1:

Он выдает исключение, когда я пытаюсь запустить его таким образом, если я оставляю бота вне функции.

const bot объявляется в другой области. Константы имеют область действия блока, поэтому имя bot не определяется за пределами области действия.

Чтобы проиллюстрировать проблему:

 {
    const a = 5
}

console.log(a);
 

Это возвращается ReferenceError , потому a что живет в другой области.

Но это прекрасно:

 {
    const a = 5
    console.log(a);
}
 

Я не могу понять, как вернуть значение боту.

Ваш ИИХФ-это асинхронная функция, все асинхронные функции возвращают обещание. Чтобы проиллюстрировать это, здесь не будет напечатано 5, потому что обещание еще не выполнено:

 async function getValue () {
    return 5;
}

console.log(getValue());
 

Если вы хотите получить значение, вам нужно подождать, пока обещание не будет выполнено:

 async function getValue () {
    return 5;
}

(async () => {
    console.log(await getValue());
})();
 

Также убедитесь, что вы не используете await вне асинхронной области:

 async function getValue () {
    return 5;
}

console.log(await getValue());
 

Это не сработает, и это приведет к ошибке. Вот почему я использовал ИИХФ с асинхронной областью.

Комментарии:

1. Спасибо, теперь я все понял.