【问题标题】:NodeJS EventEmitter not being called in event in a classNodeJS EventEmitter 未在类中的事件中调用
【发布时间】:2016-05-29 05:13:10
【问题描述】:

当我将函数注册为事件时,不会调用所述函数内部的发射。它自己的函数被调用(由日志测试)。现在,当我使用方法 2 注册事件时,它可以工作。这是为什么呢?

方法一(不调用事件):

"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 ');
});

【问题讨论】:

标签: javascript node.js eventemitter


【解决方案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 关键字 函数,你正在创建一个闭包。

【讨论】:

    【解决方案2】:

    "也许你失去了上下文,你需要使用这样的箭头函数 this.bot.on("ready", () => this.botReady());" - @yurzui

    像魅力一样工作。

    【讨论】:

    • 不,不,不。它(似乎)“工作”还不够好。请阅读我上面帖子中的链接,并确保您了解为什么一种方案有效,而另一种则无效。您可能也有兴趣阅读有关Cargo Cult Programming 的信息。最后,请务必阅读Arrow Functionsthis Closures
    • PS:请编辑您的回复:1)解释为什么“方法 1”有效而“方法 2”无效,以及 2)(新,ES6)“箭头函数”如何实现相同的效果“方法2”之类的东西。我很乐意将反对票改为赞成票 :) 在您详细说明“什么”背后的“为什么”之后,请随时接受您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2017-05-10
    • 2016-02-16
    相关资源
    最近更新 更多