Nodejs细节3:使用EventEmitter();事件模块

Nodejs细节3:使用EventEmitter();事件模块

当要定时调用某个函数可以使用EventEmitter,他会去注册你的事件到系统消息队列中去。 var emitter = new events.EventEmitter();//事件发射器 //创建http监听事件 emitter.on(“RequestEvent”, function (arg1, arg2) {

get(); //重复调用的函数

});

//请求服务器信息 function request() {

emitter.emit("RequestEvent", null, null);

}


5 回复

Nodejs细节3:使用EventEmitter();事件模块

在Node.js中,EventEmitter 是一个非常有用的内置模块,它提供了一种观察者模式来处理事件。通过 EventEmitter,我们可以注册事件并监听这些事件的发生,从而在特定事件触发时执行相应的回调函数。

示例代码

首先,我们需要引入 events 模块,并创建一个 EventEmitter 实例:

const EventEmitter = require('events');
const emitter = new EventEmitter();

接下来,我们可以定义一些事件处理器(即回调函数),并通过 on 方法将它们绑定到特定的事件上:

// 定义一个事件处理器
function handleRequest(arg1, arg2) {
    console.log(`Handling request with arguments: ${arg1}, ${arg2}`);
}

// 将事件处理器绑定到 "request" 事件
emitter.on('request', handleRequest);

然后,我们可以在需要的时候触发该事件,并传递相应的参数:

// 触发 "request" 事件
function triggerRequest() {
    const arg1 = 'arg1';
    const arg2 = 'arg2';
    emitter.emit('request', arg1, arg2);
}

// 调用触发函数
triggerRequest();

解释

  • 创建 EventEmitter 实例:首先,我们通过 require('events') 引入 events 模块,并创建一个 EventEmitter 的实例 emitter

  • 绑定事件处理器:使用 emitter.on(event, listener) 方法将一个回调函数绑定到特定的事件上。在这个例子中,我们将 handleRequest 函数绑定到名为 "request" 的事件上。

  • 触发事件:使用 emitter.emit(event, [arg1], [arg2], [...]) 方法触发一个事件,并可选地传递一些参数给绑定的回调函数。在这个例子中,我们通过 emitter.emit('request', arg1, arg2) 来触发 "request" 事件,并传递两个参数。

使用场景

EventEmitter 可以用于多种场景,例如:

  • 在HTTP服务器中监听客户端请求;
  • 在文件系统操作中监听文件读写完成事件;
  • 在网络通信中监听数据接收事件等。

通过这种方式,你可以更灵活地管理异步事件,提高代码的可维护性和扩展性。


一直不明白 EventEmitter 模块能用在什么地方…

用在你写的API里想提供一些回调函数给别人,但又不想在你的代码里显示地去处理别人的回调,就在需要调用别人回调函数的时候发个事件信号, 由调用者自己决定要不要注册你的事件,我的理解是这样的

压根不是把你的事件注册到系统消息队列里, 跟系统消息队列没一点关系, 你看过emitter的源码吗?

Node.js 细节3:使用EventEmitter()事件模块

EventEmitter 是 Node.js 中一个核心的模块,用于处理事件驱动编程。通过 EventEmitter,你可以定义事件,并在特定事件触发时执行相应的回调函数。

示例代码:

const EventEmitter = require('events');

// 创建一个 EventEmitter 实例
const emitter = new EventEmitter();

// 定义一个事件处理函数
function get() {
    console.log("正在获取数据...");
}

// 监听 "data" 事件,并注册一个回调函数
emitter.on('data', get);

// 模拟触发 "data" 事件
setTimeout(() => {
    emitter.emit('data');
}, 2000);

// 输出:
// 正在获取数据...

解释

  1. 创建 EventEmitte 实例

    const emitter = new EventEmitter();
    

    这里我们创建了一个 EventEmitter 的实例 emitter

  2. 定义事件处理函数

    function get() {
        console.log("正在获取数据...");
    }
    

    这个函数将在事件被触发时执行。

  3. 监听事件

    emitter.on('data', get);
    

    使用 on 方法注册一个事件处理函数,该函数会在 data 事件触发时执行。

  4. 触发事件

    setTimeout(() => {
        emitter.emit('data');
    }, 2000);
    

    使用 emit 方法手动触发 data 事件,此时所有监听该事件的回调函数将被执行。

通过这种方式,我们可以实现一些定时任务或条件触发的任务。例如,你可以使用 setInterval 或其他逻辑来定时触发事件,从而执行某些功能。

回到顶部