anamorph
@anamorph
javascriptLover

Можно ли получить доступ к переменной внутри функции, или как иначе решить проблему?

создаю телеграм бота на node js

есть массив с объектами Arr, и функция getRandomObj, которая возвращает из этого массива рандомный объект
по идее, бот выводит сообщение, сразу же должен запускаться таймер
далее человек жмет на кнопку либо готово, либо отмена, взависимости от чего будут применяться дальнейшие действия

bot.onText(/\/go/, function(msg, match) {
	var obj= getRandomObj();
		id = msg.chat.id;
		title = obj.title;
		time = obj.time;

	var message = title + ' for ' + time/1000/60 + ' mitute.';

	var options = {
		reply_markup: JSON.stringify({
        inline_keyboard: [
          [{ text: 'Готово!', callback_data: 'done' }],
          [{ text: 'Отменить', callback_data: 'reject' }]
        ]
      })
	};
	bot.sendMessage(id, message, options);
});


вот только есть проблемка. Куда вставить таймер?
var timerId = setTimeout( function(){
	bot.sendMessage(id, 'time is over!');
}, time)


дело в том, что time таймер должен получать из того объекта, который приходит после функции getRandomObj. Из него же и формируется сообщение
Если вставить эту функцию в bot.onText, то все работает, но вот только когда дело доходит до коллбэков, а это:
bot.on('callback_query', function(cb) {
	if (cb.data === 'done') {
		//тут надо остановить таймер
		bot.sendMessage(id, 'done');
	} else{
                //и тут
		bot.sendMessage(id, 'отклонено');
	}
});

я не могу передать этой функции timerId, чтоб его остановить

А есть вставлять ее в bot.onText, то таймер хоть и останавливается, но сообщение выводится не один раз, а сначала 1 раз, потом 2, за тем 3 раза и тд

помогите разобраться с этой проблемой и предложить варианты ее решения
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
можно пихать ид таймеров в глобальный хэшмассив с ключем по чату. ну, или какие-нибудь другие "сессии" прикрутить, если библиотека поддерживает. telegraf, вроде, поддерживает
Ответ написан
Комментировать
@tagplus5
Надо использовать сессию. Например как тут: telegraf.js.org/introduction.html#session
Ответ написан
Ваш ответ на вопрос

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

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