@Kisil

Почему не работает функция в классе?

Почему не работает функция send_group в функции checkActive, хотя в dg_clan_damage она нормально работает?
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'send_group' of undefined


Из кода убрал все лишнее
class dg {
	constructor(token,peer_id,user_id) {
		// auth VK
		this.vk = new VK({
			token: token, // Token group
		});
		this.peer_id = peer_id;
		this.user_id = user_id;
		this.group_id = -123123123;

		// bind
		this.send_group = this.send_group.bind(this);
		this.sendInterval = this.sendInterval.bind(this);
		this.clan_damage = this.clan_damage.bind(this);
	};

	async send_group(text) {
		try{
			var res = await this.vk.api.messages.send({
				peer_id: this.user_id,
				message: text,
				access_token: TOKEN
			});
		} catch (e) {
			console.log(`-----------------------\nошибка отправки сообщения пользователю ${this.user_id}:\n\n${e}\n\n`)
		}
	};

	async checkActive(user_id,db) {
		new User(user_id, db, async function (user) {
			console.log("Auto-bot: " + user.dg.is_active)

			if (!user.dg.is_active) {
				this.send_group(" Бот остановлен")
        process.exit()
			}
		})
	}

	async dg_clan_damage(){
		setTimeout(this.clan_damage, 1000);
		this.send_group(' clan_damage комплект, запущен!')
	}
}

connectToDB(MONGOURI, (db) => {
	let token = process.argv[4]
	let peer_id = Number(process.argv[3])
	let user_id = Number(process.argv[2])

	let bot = new dg(token,peer_id,user_id)
	bot.dg_clan_damage()
	setInterval(bot.checkActive, 2 * 1000,user_id,db)
});
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
Aetae
@Aetae
Тлен
Потому что у каждой function - свой this, принимающий значение на момент вызова(если явно не указано обратного). Так как в данном случае функция async function (user) { - это колбэк, this у неё определяет вызывающая сторона, т.е. что-то в дебрях класса User, который ничего сам не знает о вашем dg.
Используйте для колбэка стрелочную функцию, либо bind'ите и колбэк.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы