其他模块中的节点事件发射器

Node event emitter in other modules

本文关键字:事件 发射器 节点 模块 其他      更新时间:2023-09-26

我有三个不同的javascript文件,最小的一个是发出事件,而第二个(较大的一个)文件会拾取事件并将其进一步发送到主文件。这就是我迄今为止所尝试的:

//mini.js
var EventEmitter = require('events').EventEmitter;
var ee = new EventEmitter;
console.log("Emitting event");
var message = "Hello world";
ee.emit('testing',message);

//second.js
var mini = require('./mini.js');
var EventEmitter = require('events').EventEmitter;
var ee = new EventEmitter;
mini.on('testing',function(message){
    console.log("Second file received a message:",message);
    console.log("Passing further");
    ee.emit('testing',message);
});
//main.js
var sec = require('./second.js');
sec.on('testing',function(message){
    console.log("Main file received the message",message);
});

然而,我得到

mini.on('testing',function(message){
        ^
TypeError: undefined is not a function

使用节点执行文件时出错。

我在这里做错了什么?感谢

您没有在mini.js中导出EventEmitter实例。将其添加到mini.js:

module.exports = ee;

如果您想导出其EventEmitter实例以使其可用于main.js,您还需要在second.js中添加类似的行。

您将遇到的另一个问题是,在second.js添加其testing事件处理程序之前,您在mini.js中发出testing,因此它最终会丢失该事件。

这个应该有效:

这是要先放在内部的内容。js:

//first.js
var util = require('util'),
    EventEmitter = require('events');

function First () {
  EventEmitter.call(this)
}
util.inherits(First, EventEmitter);

First.prototype.sendMessage = function (msg) {    
  this.emit('message', {msg:msg});
};

module.exports = First;

这是要放入second.js:中的内容

//second.js
var First = require('./first.js');
var firstEvents = new First();
// listen for the 'message event from first.js'
firstEvents.on('message',function(data){
    console.log('recieved data from first.js is : ',data);
});

// to emit message from inside first.js
firstEvents.sendMessage('first message from first.js');

现在运行node second.js,应该会为您触发"message"事件。

您可以使用此模式来实现模块之间的任何级别的消息传递。

希望这能有所帮助。