(译)Node.js的 EventEmitter 教程
2014-05-06 22:35
253 查看
原文标题:Node.js EventEmitter Tutorial
原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.html
听说过 Node.js 中的
EventEmitter吗?也许你知道大部分内置的 Node.js 库 都使用它,也许你总是对
EventEmitter充满好奇,但是没有谁向你解释?
在这个教程中,我会给你一些关于
EventEmitter类的例子。
你必须熟悉各种 Node.js 中的事件比如:
on data,
on end,
on error等等之类的。事件机制的工作做得天衣无缝,十分完美,难道不是吗?所有的基于事件的 Node.js 库都依赖于
EventEmitter类,你可能会说那些库都继承了
EventEmitter。
EventEmitter的强大之处不仅限于内置的 Node.js 库,你也可以拥有它!
展示
EventEmitter能力的最好方法就是通过一个例子,看看这个:
var EventEmitter = require('events').EventEmitter; var radium = new EventEmitter(); //绑定 radiation 事件 radium.on('radiation', function(ray) { console.log(ray); }); setInterval(function() { //触发 radiation 事件 radium.emit('radiation', 'GAMMA'); }, 1000);
注意到了吧,创建一个事件,添加一个事件监听器,触发事件,通过事件传递数据是多么的简单。所有的这些因为
EventEmitter的魔力而实现。
EventEmitter让编写令人惊讶的 Node.js 库变得可能。
上面的例子基于一个
EventEmitter的实例,我们怎么做才能创建一个继承自
EventEmitter的类呢?Node.js 有一个,叫做
util的库,它有一个方法:
inherits,实现对象之间原型继承的函数。我们可以很轻松的通过它让一个类继承另一个类(准确的说不能叫类):
var util = require('util'); util.inherits(MyClass, SuperClass);
使用
util.inherits(),我们创建了一个继承自
EventEmitter的模块,注意下面的代码:
radio.js 中的内容:
var util = require('util'); var EventEmitter = require('events').EventEmitter; //一个包含 "freq" 和 "name" 属性的对象 var Radio = function(station) { //保存 指向Radio的this,在setTimeout()中使用 var self = this; setTimeout(function() { self.emit('open', station); }, 0); setTimeout(function() { self.emit('close', station); }, 5000); this.on('newListener', function(listener) { console.log('Event Listener: ' + listener); }); }; //Radio 继承 EventEmitter util.inherits(Radio, EventEmitter); module.exports = Radio;
我们创建了一个继承自
EventEmitter的模块。接下来让我们看看如何在一个例子中使用创建的模块。
example.js 中的内容:
var Radio = require('./radio.js'); var station = { freq: '80.16', name: 'Rock N Roll Radio', }; // 创建一个Radio实例 var radio = new Radio(station); //添加一个“open”事件监听器 radio.on('open', function(station) { console.log('"%s" FM %s OPENED', station.name, station.freq); console.log('? ??'); }); //添加一个“close”事件监听器 radio.on('close', function(station) { console.log('"%s" FM %s CLOSED', station.name, station.freq); });
运行 example.js 准备好见证
EventEmitter的魔力。
如果因为某些原因你不想使用
util模块,你可以用这种方法来拓展一个类。
Apple.prototype = Object.create(require('events').EventEmitter.prototype);
EventEmitter可以帮你编写令人印象深刻的基于事件的 Node.js 模块。同时,作为作为一个 Node.js 的开发人员,你掌握的关于
EventEmitter的知识会大大影响你的工作效率。所以,确保你阅读了关于
EventEmitter的更详细的资料,并且掌握里里外外它是如何工作的。如果你不了解
EventEmitter,那你也不了解 Nodejs.js
(完)
翻译水平有待提高,所翻译的博文并不是按照原文一句一句翻译,而是添加了自己对文章的理解。如有不正之处,欢迎指正!
个人笔记,仅供参考。
相关文章推荐
- 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构
- 从零开始学习Node.js系列教程之设置HTTP头的方法示例
- learn nodejs by doing 教程1<nodejs基础 >
- Nginx+SSL+Node.js运行环境配置教程
- windows下node.js安装教程图文详解
- node.js零基础详细教程(7):node.js操作mongodb,及操作方法的封装
- 在Ubuntu系统上安装Node.JS的教程
- node.js安装教程【Linux环境】
- node.js的安装教程
- 使用npm发布Node.JS程序包教程
- nodejs+npm+gulp使用入门教程
- 【Node.js】mongoose教程09--删除
- 饿了么大前端 Node.js 进阶教程
- Node.js+Express配置入门教程
- node.js入门教程
- 从零开始学习Node.js系列教程一:http get和post用法分析
- Node.js入门教程:Node.js如何安装配置并部署一个网站
- Node.js教程(一)入门和学习资源
- Node.js教程
- 24个很赞的 Node.js 免费教程和在线指南