NodeJs:事件模块

106 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

Event模块是Nodejs中最核心的模块,这是因为Nodejs本身架构就是事件式的,而Event模块为这一设计提供了唯一的接口。因为这种设计,Event模块不仅用于用户代码与Nodejs下层事件循环的交互,还几乎被所有的模块依赖。那么这么重要的Event模块,我们应该如何使用呢?

事件发射器

Event模块提供了一个唯一的对象:events.EventEmitter。EventEmitter的每个事件都由一个事件名和若干个参数组成。对于每个事件,EventEmitter支持若干事件监听器。当事件被发起时,注册到这个事件的监听器被依次调用,事件参数作为回调函数参数传递。

让我们看看下面这个例子:

var events = require('events ' ) ;

var emitter = new events.EventEmitter();

emitter .on ( 'someEvent',function(arg1, arg2) {
    console.log('listener1', arg1, arg2);
});

emitter.on('someEvent', function(argl, arg2){
    console.log('listener2', arg1, arg2);
});

emitter.emit('someEvent , 'byvoid', 1991);

在上面的代码中,var events = require('events ' ) ;用于引入Events模块,var emitter = new events.EventEmitter(); 创建了一个events.EventEmitter对象。然后两段代码注册了someEvent事件的两个监听函数。emitter.emit('someEvent , 'byvoid', 1991);发起了一个someEvent事件。

其他API

除了上面提到的函数之外,EventEmitter还提供了其他的API。

EventEmitter.on(event, listener):为指定事件注册一个监听器,接受一个字符串event和一个回调函数 listener。

EventEmitter.emit ( event , [arg1], [arg2],[ ...]):发射event 事件,传递若干可选参数到事件监听器的参数表。

EventEmitter.once(event , listener): 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。

EventEmitter.removeListener(event, listener):移除指定事件的某个监听器,listener必须是该事件已经注册过的监听器。

EventEmitter.removeAllListeners([event ]):移除所有事件的所有监听器,如果指定event,则移除指定事件的所有监听器。

error事件

EventEmitter定义了一个特殊的事件error,它用于代码程序运行时遇到了错误,当我们在遇到异常的时候,程序通常会发起一个error事件。我们一般要为会发起error事件的对象设置监听器,避免遇到错误后整个程序崩溃同时定义如何处理异常。