Node.js 事件发射器

  • 事件发射器

    Node中的许多对象都会发出事件,例如net.Server每次对等点连接到它时都会发出一个事件,而fs.readStream在文件打开时会发出一个事件。发出事件的所有对象都是events.EventEmitter的实例。
  • EventEmitter类

    如上一节所述,EventEmitter类位于事件模块中。可通过以下代码访问-
    
    // 导入 events 模块
    var events = require('events');
    
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    EventEmitter实例遇到任何错误时,它将发出“error”事件。添加新的侦听器时,将触发“newListener”事件,而删除侦听器时,将触发“removeListener”事件。EventEmitter提供多个属性,如onemiton属性用于将函数与事件绑定,emit用于触发事件。
    方法 描述
    addListener(event, listener) 在侦听器数组的末尾为指定事件添加一个侦听器。不检查是否已添加侦听器。通过事件和侦听器的相同组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。
    on(event, listener) 在侦听器数组的末尾为指定事件添加一个侦听器。不检查是否已添加侦听器。通过事件和侦听器的相同组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。
    once(event, listener) 向事件添加一次侦听器。仅在下次触发事件时才调用此侦听器,然后将其删除。返回发射器,因此可以链接调用。
    removeListener(event, listener) 从侦听器数组中删除指定事件的侦听器。注意-它将更改侦听器后面的侦听器数组中的数组索引。 removeListener最多将从侦听器数组中删除一个侦听器实例。如果已针对指定事件多次将任何单个侦听器添加到侦听器数组,则必须多次调用removeListener才能删除每个实例。返回发射器,因此可以链接调用。
    removeAllListeners([event]) 删除所有侦听器,或指定事件的侦听器。删除添加在代码其他位置的侦听器不是一个好主意,尤其是当侦听器位于您未创建的发射器上时(例如套接字或文件流)。返回发射器,因此可以将调用链接起来setMaxListeners(n)默认情况下,如果为特定事件添加了10个以上的侦听器,则EventEmitters将打印警告。这是一个有用的默认值,有助于查找内存泄漏。显然,并非所有发射器都应限制为10个。此功能可以增加该发射器。设置为零表示无限。
    listeners(event) 返回指定事件的侦听器数组。
    emit(event, [arg1], [arg2], [...]) 使用提供的参数按顺序执行每个侦听器。如果事件具有侦听器,则返回true,否则返回false。
  • 类方法

    方法 描述
    listenerCount(emitter, event) 返回给定事件的侦听器数。
  • 事件

    事件 描述
    newListener
    • event − String: 事件名称
    • listener − Function: 事件处理函数
    每当添加侦听器时都会发出此事件。 触发此事件后,可能尚未将侦听器添加到该事件的侦听器数组中。
    removeListener
    • event − String: 事件名称
    • listener − Function: 事件处理函数
    每当有人删除侦听器时,都会发出此事件。 触发此事件后,可能尚未从该事件的侦听器数组中删除该侦听器。
  • 示例

    使用以下Node.js代码创建一个名为main.js的js文件-
    
    var events = require('events');
    var eventEmitter = new events.EventEmitter();
    
    // listener #1
    var listner1 = function listner1() {
       console.log('listner1 执行.');
    }
    
    // listener #2
    var listner2 = function listner2() {
       console.log('listner2 执行.');
    }
    
    // 将connection事件与listner1函数绑定
    eventEmitter.addListener('connection', listner1);
    
    // 将connection事件与listner2函数绑定
    eventEmitter.on('connection', listner2);
    
    var eventListeners = require('events').EventEmitter.listenerCount
       (eventEmitter,'connection');
    console.log(eventListeners + " 侦听器正在监听connection事件");
    
    // 触发connection事件
    eventEmitter.emit('connection');
    
    // 删除listner1函数的绑定
    eventEmitter.removeListener('connection', listner1);
    console.log("Listner1 现在不不在侦听.");
    
    // 触发connection事件
    eventEmitter.emit('connection');
    
    eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
    console.log(eventListeners + " 侦听器正在监听connection事件");
    
    console.log("程序终止.");
    
    尝试一下
    
    $ node main.js
    
    应该产生以下结果-
    
    2 侦听器正在监听connection事件
    listner1 执行.
    listner2 执行.
    Listner1 现在不不在侦听.
    listner2 执行.
    1 侦听器正在监听connection事件
    程序终止.