Событие, которое не срабатывает / перехвачено

#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 ) к каждому назначенному обратному вызову.