 
- Node.js 教程
- Node.js - 主页
- Node.js - 简介
- Node.js - 环境设置
- Node.js - 第一个应用程序
- Node.js - REPL 终端
- Node.js - 包管理器 (NPM)
- Node.js - 回调概念
- Node.js - 事件循环
- Node.js - 事件发射器
- Node.js - 缓冲区
- Node.js - 流
- Node.js - 文件系统
- Node.js - 全局对象
- Node.js - 实用模块
- Node.js - Web 模块
- Node.js - Express 框架
- Node.js - RESTFul API
- Node.js - 扩展应用程序
- Node.js - 打包
- Node.js - 内置模块
- Node.js 有用资源
- Node.js - 快速指南
- Node.js - 有用的资源
- Node.js - 讨论
Node.js - 事件发射器
Node 中的许多对象都会发出事件,例如,每次对等点连接到 net.Server 时,net.Server 都会发出一个事件,fs.readStream 在打开文件时会发出一个事件。所有发出事件的对象都是 events.EventEmitter 的实例。
事件发射器类
正如我们在上一节中看到的,EventEmitter 类位于事件模块中。它可以通过以下代码访问 -
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
当 EventEmitter 实例遇到任何错误时,它会发出“错误”事件。添加新侦听器时,会触发“newListener”事件;删除侦听器时,会触发“removeListener”事件。
EventEmitter 提供了多个属性,例如on和emit。on属性用于将函数与事件绑定,emit用于触发事件。
方法
| 先生。 | 方法及说明 | 
|---|---|
| 1 | 添加监听器(事件,监听器) 在指定事件的侦听器数组末尾添加侦听器。不会检查侦听器是否已添加。传递相同的事件和侦听器组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。 | 
| 2 | on(事件,侦听器) 在指定事件的侦听器数组末尾添加侦听器。不会检查侦听器是否已添加。传递相同的事件和侦听器组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。 | 
| 3 | 一次(事件,侦听器) 向事件添加一次性侦听器。仅在下次触发事件时才调用此侦听器,之后将其删除。返回发射器,因此可以链接调用。 | 
| 4 | 移除监听器(事件,监听器) 从指定事件的侦听器数组中删除侦听器。注意 -它更改侦听器后面的侦听器数组中的数组索引。removeListener 最多将从侦听器数组中删除一个侦听器实例。如果任何单个侦听器已多次添加到指定事件的侦听器数组中,则必须多次调用removeListener 才能删除每个实例。返回发射器,因此可以链接调用。 | 
| 5 | 移除所有监听器([事件]) 删除所有侦听器或指定事件的侦听器。删除在代码中其他位置添加的侦听器并不是一个好主意,特别是当它位于您未创建的发射器上时(例如套接字或文件流)。返回发射器,因此可以链接调用。 | 
| 6 | 设置最大监听器(n) 默认情况下,如果为特定事件添加了超过 10 个侦听器,EventEmitters 将打印警告。这是一个有用的默认值,有助于查找内存泄漏。显然,并非所有发射器都应限制为 10 个。此功能允许增加发射器数量。设置为零表示无限制。 | 
| 7 | 听众(事件) 返回指定事件的侦听器数组。 | 
| 8 | 发出(事件,[arg1],[arg2],[...]) 使用提供的参数按顺序执行每个侦听器。如果事件有侦听器,则返回 true,否则返回 false。 | 
类方法
| 先生。 | 方法及说明 | 
|---|---|
| 1 | 监听器计数(发射器,事件) 返回给定事件的侦听器数量。 | 
活动
| 先生。 | 活动及描述 | 
|---|---|
| 1 | 新监听器 
 每当添加侦听器时都会发出此事件。当触发此事件时,侦听器可能尚未添加到该事件的侦听器数组中。 | 
| 2 | 移除监听器 
 每当有人删除侦听器时都会发出此事件。当触发此事件时,侦听器可能尚未从该事件的侦听器数组中删除。 | 
例子
使用以下 Node.js 代码创建一个名为 main.js 的 js 文件 -
var events = require('events');
var eventEmitter = new events.EventEmitter();
// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}
// listener #2
var listner2 = function listner2() {
   console.log('listner2 executed.');
}
// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);
// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);
var eventListeners = require('events').EventEmitter.listenerCount
   (eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");
// Fire the connection event 
eventEmitter.emit('connection');
// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");
// Fire the connection event 
eventEmitter.emit('connection');
eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");
console.log("Program Ended.");
现在运行 main.js 来查看结果 -
$ node main.js
验证输出。
2 Listner(s) listening to connection event listner1 executed. listner2 executed. Listner1 will not listen now. listner2 executed. 1 Listner(s) listening to connection event Program Ended.
