如何在现有对象上调用EventEmitter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在现有对象上调用EventEmitter相关的知识,希望对你有一定的参考价值。

我想将现有对象设置为EventEmitter,例如:

var emitter = {};
EventEmitter.call(emitter);
console.log(emitter.on);

但是,emitter.on是未定义的,而不是一个函数。

答案

我不确定你在哪里有这样的想法:

 EventEmitter.call(emitter);

将神奇地赋予您的发射器对象所有EventEmitter功能。该语句的作用是调用EventEmitter构造函数并将其作为this参数传递给它。这将导致构造函数执行并可能在您的emitter对象上设置一些数据,但它不会以任何方式将EventEmitter原型附加到您的对象,因此EventEmitter原型上的任何方法都不会绑定到您的对象,因此.on()undefined


根据您可以控制和正在尝试完成的内容,有多种方法可以采用现有对象的功能。

如果您控制要成为EventEmitter的对象的定义,那么您只想继承EventEmitter对象,然后您的对象将“成为”EventEmitter并拥有其所有方法和数据。

使用ES6类语法继承:

// myobj.js
const EventEmitter = require('events');

// inherit directly from EventEmitter
class MyObj extends EventEmitter {
  constructor () {
    super() 
  }
  // your other custom methods here
}

module.exports = MyObj;

然后,你会像这样使用:

const MyObj = require("myobj.js");
let obj = new MyObj();
obj.on("hello", data => {
    console.log("got hello message");
});

obj.emit("hello", "to you");

如果您不控制要为EventEmitter提供逻辑的对象的定义或构造,那么您需要决定是否要“成为”或“拥有”EventEmitter。

在“be a”路径中(除了它自己的函数之外,你希望你的对象“成为”EventEmitter),你混合使用EventEmitter对象的逻辑,并在你自己的对象之后将所有方法和数据添加到你自己的对象中已经创建了。这不是万无一失的,因为某些类型的对象可能依赖于您无法合适的私有数据。但是,它确实适用于许多对象。

对于EventEmitter,有一个特定的模块,可以让你“mixin”和EventEmitter。它被称为component-emitter on NPM,非常容易使用。 socket.io使用它right here,以便它的套接字对象可以是EventEmitter

var Emitter = require('component-emitter');

/**
 * Mix in `Emitter`.
 */

Emitter(Socket.prototype);

对于“has a”路径,您只需创建一个EventEmitter对象并将其放在您自己的对象的实例数据中,然后为您的EventEmitter功能引用该特定对象。您可以手动获取该对象并使用它,也可以使用一些方法自动使用它。这实现起来更简单,更简单,但在某些情况下使用起来并不方便(这一切都取决于你要做的事情的细节)。

class MyObj {
  constructor () {
    super() 
    this.myEmitter = new EventEmitter();
  }
  // your other custom methods here
  broadcast(msg, data) {
      // use the internal eventEmitter object we have in our instance data
      this.myEmitter.emit(msg, data);
  }
}

module.exports = MyObj;
另一答案

最简单的方法是使用ES6 Class syntax via the class keyword并使用extends关键字创建EventEmitter的子类。以下是如何通过q​​azxswpoi创建自己的EventEmitter的简单示例。

Prototypal Inheritance

// MyEmitter.js
const EventEmitter = require('events')

class MyEmitter extends EventEmitter {
  constructor () {
    super() 
    this.emit('created', 'New Instance of MyEmitter Created')
  }
}

module.exports = MyEmitter
另一答案

你可以通过两种方式来解决这个问题,要么扩展// index.js const MyEmitter = require('./MyEmitter') // Create a new instance of MyEmitter const emitter = new MyEmitter() // Attach an Event Listener for the 'created' event // Print whatever the message is to stdout emitter.on('created', message => console.log) 类,要么将EventEmitter的原型设置为emitter的原型;

EventEmitter

以上是关于如何在现有对象上调用EventEmitter的主要内容,如果未能解决你的问题,请参考以下文章

Angular 8 @output EventEmitter不允许发射对象

Nodejs - EventEmitter,Buffer

Node.js回调函数事件机制(EventEmitter类)全局对象

我创建自定义EventEmitter时不应该调用.emit吗?

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )(代码片

javascript 简单的代码示例EventEmitter()如何在节点js中工作