#javascript #node.js
#javascript #node.js
Вопрос:
У меня есть класс DiscordClient, который я хотел бы генерировать события, потому что я хочу, чтобы другие классы могли реагировать на них. Но либо событие не срабатывает, либо оно не улавливается.
Результаты, которые я получаю, — это консоль.вызовы журнала внутри созданного класса в методах on_connect()
and on_message()
отправляются на консоль, однако функции обратного вызова в index.js
не вызываются (я думаю?). В любом случае, там ничего не происходит. И я пробовал переупорядочивать вещи, но ничего из того, что я пробовал, не помогает.
discordclient.js
require("dotenv/config")
const { EventEmitter } = require("events")
const Discord = require("discord.js")
class DiscordClient extends EventEmitter {
constructor() {
super()
this.client = new Discord.Client()
this.client.on( "ready", this.on_connect )
this.client.on( "message", this.on_message )
}
connect() {
this.client.login(process.env.DISCORD_TOKEN)
}
on_connect() {
this.emit("discord_connected")
console.log("Connected to Discord server.")
}
on_message( message ) {
const payload = {
name : `${message.member.displayName}`,
channel: `${message.channel.name}`,
message: `${message.content}`
}
this.emit( "discord_message", payload )
console.log( payload )
}
}
module.exports = DiscordClient
index.js
"use strict"
const DiscordClient = require("./discordclient")
const discord = new DiscordClient()
const discordConnected = () => console.log( "Connected to Discord server.")
const discordMessage = data => console.log( data )
discord.on( "discord_connected", discordConnected )
discord.on( "discord_message", discordMessage )
discord.connect()
Ответ №1:
Вам нужно убедиться, что вы привязываете свои обратные вызовы к текущему объекту.
constructor() {
super()
this.client = new Discord.Client()
this.client.on( "ready", this.on_connect )
this.client.on( "message", this.on_message )
}
Должно быть:
constructor() {
super()
this.client = new Discord.Client()
this.client.on( "ready", this.on_connect.bind( this ) )
this.client.on( "message", this.on_message.bind( this ) )
}
Ie. Я добавил bind( this )
к каждому назначенному обратному вызову.