NodeJS EventEmitter未在类

时间:2016-05-29 05:13:11

标签: javascript node.js eventemitter

当我将函数注册为事件时,不会调用所述函数内的emit。它自称的函数(由log测试)。现在,当我使用方法2注册事件时,它可以工作。这是为什么?

方法1(不调用事件):

"use strict";
const EventEmitter = require("events");

class DiscordBot extends EventEmitter{
  constructor(key){
    super();
  }

  startBot(){
    var self = this;
    this.bot.on("ready",self.botReady);
  }

  botReady(){
    var self = this;
    self.emit("Bot_Ready");
    console.log("TESD");
  }
}

方法2(有效):

"use strict";
const EventEmitter = require("events");

class DiscordBot extends EventEmitter{
  constructor(key){
    super();
  }

  startBot(){
    var self = this;
    this.bot.on("ready",function () {
      self.botReady();
    });
  }

  botReady(){
    var self = this;
    self.emit("Bot_Ready");
    console.log("TESD");
  }

}

寄存器:

    bot.on("Bot_Ready", function(){
    console.log('this happens ');
});

2 个答案:

答案 0 :(得分:1)

这会创建一个closure

this.bot.on("ready",function () {
  self.botReady();
});

方法1不:

  startBot(){
    var self = this;
    this.bot.on("ready",self.botReady);
  }

从上面的MDN链接:

  

闭包是一种特殊的对象,它结合了两件事:   功能,以及创建该功能的环境。该   环境由任何在范围内的局部变量组成   关闭创建的时间。

这是另一个可能有助于解释的好链接:

How do JavaScript closures work?

请注意这一部分:

  

在JavaScript中,如果在另一个内部使用function关键字   函数,你正在创建一个闭包。

答案 1 :(得分:0)

“也许你失去了背景,你需要使用像这样的箭头函数this.bot.on(”ready“,()=> this.botReady());” - @yurzui

像魅力一样工作。