Node.js EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
EventEmitter 类
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
你可以通过require("events");来访问该模块。
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
EventEmitter 对象如果在实例化时发生错误,会触发 'error' 事件。当添加新的监听器时,'newListener' 事件会触发,当监听器被移除时,'removeListener' 事件被触发。
下面我们用一个简单的例子说明 EventEmitter 的用法:
//event.js 文件 var EventEmitter = require('events').EventEmitter; var event = new EventEmitter(); event.on('some_event', function() { console.log('some_event 事件触发'); }); setTimeout(function() { event.emit('some_event'); }, 1000);
执行结果如下:
运行这段代码,1 秒后控制台输出了 'some_event 事件触发'。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。
$ node event.js some_event 事件触发
EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:
//event.js 文件 var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent', function(arg1, arg2) { console.log('listener1', arg1, arg2); }); emitter.on('someEvent', function(arg1, arg2) { console.log('listener2', arg1, arg2); }); emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
执行以上代码,运行的结果如下:
$ node event.js listener1 arg1 参数 arg2 参数 listener2 arg1 参数 arg2 参数
以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。
运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter最简单的用法。
转自:nodejs菜鸟教程
相关推荐
这个"nodejs中软学习配套源码"是作者在学习Node.js过程中编写的示例代码,旨在帮助初学者更好地理解和实践Node.js的核心概念。 在Node.js的学习过程中,你可能会接触到以下几个关键知识点: 1. **非阻塞I/O模型**...
**ES6 示例代码详解** 本项目“es6-examples”是一个深入探讨ES6新特性的实践集合,主要涉及Promise、EventEmitter以及浏览器和Node.js的...同时,这也将帮助你更好地掌握在实际开发中如何运用ES6特性,提高代码质量。
在“NodeJS-LFW212”项目中,你可能会看到许多使用`eventEmitter`模块的例子,通过监听和触发事件来实现不同组件之间的通信。 2. **V8引擎** Node.js使用Google的V8引擎来执行JavaScript代码,这使得它能以接近...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行...这个“nodejs-exercises”项目可能包含了上述知识点的实践示例,通过练习,后端开发者能够巩固理论知识,提升实际操作技能,更好地在实际项目中运用 Node.js。
学习 Node.js,你需要掌握如何编写事件监听器和触发器,以及理解和使用 `EventEmitter` 类。 其次,Node.js 提供了丰富的内置模块,如 `fs`(文件系统)、`http`(HTTP 协议)、`path`(路径操作)等。`fs` 模块...
通过深入学习和实践这些知识点,你将能够熟练运用Node.js进行Web开发、构建服务器、处理数据、实现高并发应用。同时,Node.js的生态不断发展,不断有新的库和工具涌现,持续学习和关注社区动态,将使你在Node.js领域...
在Node.js环境中,"simple-nodejs-nonblocking-process"这一主题主要关注的是如何利用JavaScript的非阻塞I/O特性来优化程序性能。Node.js是基于Chrome V8引擎的JavaScript运行环境,它的一大特色就是异步、非阻塞I/O...
3. **EventEmitter**: Node.js 内置的 EventEmmitter 类是处理事件的关键,聊天室中的各种交互(如用户发送消息、新用户加入等)都可以看作是事件,通过监听和触发这些事件来控制程序的流程。 4. **Express 框架**:...
理解和运用`EventEmitter`类来处理事件和监听器是解决挑战的重要部分。 9. **错误处理**:良好的错误处理是任何程序的基础。学习如何使用`try...catch`语句,以及如何妥善处理异步错误。 10. **单元测试**:通过...
在本资源"Ej_MiriadaxCurso2_Mods_1a3"中,我们面对的是一个与Miriadax课程相关的Node.js练习集合,重点在于快速掌握和运用JavaScript编程技能。Miriadax是一个在线教育平台,提供各种技术课程,而这个练习集是由...
### Professional Node.js:构建基于JavaScript的可扩展软件 ...通过上述内容的学习,开发者可以全面掌握Node.js的各项核心技术,并能够运用到实际项目开发中去,构建出高性能、可扩展的应用程序。
通过使用`eventEmitter`对象,开发者可以实现事件监听和触发,提高代码的可读性和可维护性。此外,`async/await`语法的引入,使得异步编程更加简洁,避免了回调地狱的问题。 Node.js的模块系统也是其亮点之一,`...
第二部分,Node核心API基础(Node Core API Basics),详细介绍了Node.js的核心模块,例如如何加载模块、使用Buffer来处理二进制数据、EventEmitter模式简化事件绑定、使用定时器来调度函数执行等。这部分为开发者...
通过本书,我们可以深入理解并运用Node.js来开发实际项目。 首先,Node.js的基础知识是学习的重点。它基于Chrome的V8引擎,允许开发者在服务器端使用JavaScript编写代码,打破了JavaScript只能在浏览器中运行的局限...