srko
@srko
JavaScript / HTML / CSS

Как передать переменную из одной функции в другую?

Не могу заставить работать бота для Telegram. Может кто-то взглянет на код?

Как из метода объекта вытянуть переменную (id чата, которое я могу получить только при отправке сообщения боту) и передать его во внешнюю функцию?

Код с пояснениями:

var TelegramBot = require('node-telegram-bot-api');
var fetch = require('node-fetch');
var CronJob = require('cron').CronJob;

var token = 'xxxxxxxxxxxxxxxxxxxxxxxx';
var botOptions = {
  polling: true,
};

var bot = new TelegramBot(token, botOptions);

var options = {
  host: 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5',
};

// создаю cron, который выполняет функцию (отправка сообщения с текстом)
// каждые 3 секунды
var job = new CronJob({
  cronTime: '*/3 * * * * 1-5',
  // должно срабатывать при выполнении job.start();
  onTick() {
    console.log('→ → → → → working');
    // функция не работает, потому что messageChatId объявляется в bot.on()
    // как сюда ее передать??!
    updateGlobalCurrencyList(messageChatId);
  },
  // срабатывает по завершении
  onComplete() {
    console.log('→ → → → → FINISHED');
  },
  start: false,
  timeZone: 'Europe/Kiev',
  // здесь можно указать контекст выполнения,
  // но что сюда передать я ума не приложу
   // ни bot, ни bot.on не работают
  // context: ,
});

bot.getMe().then((me) => {
  console.log('Hello! My name is %s', me.first_name);
  console.log('My id is %s', me.id);
  console.log('And my username is %s', me.username);
});


bot.on('text', (msg) => {
  // срабатывапет на любое текстовое сообщение
  var messageChatId = msg.chat.id;
  var messageText = msg.text;
  // опции клавиатуры
  var opts = {
    reply_markup: JSON.stringify({
      keyboard: [
        ['USD'],
        ['EUR', 'RUB'],
      ],
      one_time_keyboard: false,
      resize_keyboard: true,
      force_reply: true,
    }),
  };

  if (messageText.indexOf('/every') === 0) {
    // запускает cron, но контекст отсюда не берет
    // как передать messageChatId в job?
    job.start();
  }
  if (messageText.indexOf('/none') === 0) {
    console.log('→ → → → → stoping');
    // останавливает cron
    job.stop();
  }

  if (messageText.indexOf('/rates') === 0) {
    updateGlobalCurrencyList(messageChatId);
  } else if (messageText) {
    numberToCurrency(messageChatId, messageText, opts);
  }
});


Если создаю job внутри bot.on, то job нельзя остановить, так как job будет создаваться для каждого сообщения (как мне тут уже подсказывали).

Что можно сделать? Как решить?
  • Вопрос задан
  • 833 просмотра
Решения вопроса 1
@WhiteSama
глобальной переменной?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@superivankorolev
А так?

function start(messageChatId){	
	var job = new CronJob();
	job.start();
    return job;
}

if(messageText.indexOf('/every') === 0){
	start(messageChatId);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы