(译)Node.js的 EventEmitter 教程

原文标题:Node.js EventEmitter Tutorial
原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.html

听说过 Node.js 中的 EventEmitter 吗?也许你知道大部分内置的 Node.js 库 都使用它,也许你总是对
EventEmitter 充满好奇,但是没有谁向你解释?

在这个教程中,我会给你一些关于 EventEmitter 类的例子。

你必须熟悉各种 Node.js 中的事件比如: on dataon endon
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

(完)

翻译水平有待提高,所翻译的博文并不是按照原文一句一句翻译,而是添加了自己对文章的理解。如有不正之处,欢迎指正!
个人笔记,仅供参考。

参考: http://www.hacksparrow.com/node-js-eventemitter-tutorial.html

时间: 2024-11-05 21:53:45

(译)Node.js的 EventEmitter 教程的相关文章

(译)Node.js的全局变量

原文标题:Global Variables in Node.js原文链接:http://www.hacksparrow.com/global-variables-in-node-js.html 你可能正在使用一些 Node.js 的模块,或者一个框架比如 Express.js ,并且突然感觉你需要创建一些全局变量.在 Node.js 中你会如何创建全局变量? 在这个问题上,大多数的建议是"不使用 var 声明变量",或者是"把变量添加到 global 对象上",亦或

(译)Node.js的模块-exports和module.exports

原文标题:Node.js Module – exports vs module.exports原文链接:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html exports 和 module.exports 有什么区别? 你一定很熟悉 Node.js 模块中的用来在你的模块中创建函数的 exports 对象,就像下面这样. 创建一个叫做rocker.js的文件: exports.name = function() {

深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)

events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中的事件进行统一管理,使用events可以对特定的API事件进行添加,触发和移除等.我们可以通过 require('events')来访问该模块. 比如如下代码: // 引入 events 模块 const events = require('events'); console.log(events)

[js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义

一.转义与非转义 jade模板文件代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title jade学习-by ghostwu 6 body 7 h3 转义与非转义 8 - var userName = 'ghostwu' 9 - var str = '<script>alert("ghostwu");</script>' 10 div #{userName} 11 div #{str} 1

WebStorm中Node.js项目配置教程——项目设置

上一章讲解了Node.js项目在WebStorm中的两种创建方式,当完成Node.js项目创建以后,剩下的就是涉及配置设置工作. 为了确保Node.js全局和Node.js核心模块的代码完成功能,打开Settings|Languages & Frameworks | JavaScript|Libraries进行设置: 值得注意的是:WebStorm将建议创建一个Node.js依赖的JavaScript库,并添加到列表用于代码完成.语法突出显示.导航和文档查找等. 对于Express框架,可以直接

[js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用

一.block 模块复用 把需要复用的模块用block定义 block后面跟上模块的名字,引用一次block 内容就会被复用一次 编译之后的结果: 二,继承模板(extends) 在实际开发中,网站的头部,尾部一般都是公用的,我们可以通过jade的模板继承( extends ) 功能,把公共部分抽象出来,然后让不同的页面继承这些公共部分, 而且继承过来之后还可以重写 新建一个layout.jade模板 这是一个公共的模板,如果我们的首页需要这个公共模板,同时首页需要修改这个公共模板的布局部分(

[js高手之路]Node.js模板引擎教程-jade速学与实战1

环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade的命令行用法 一.在项目目录下新建index.jade文件 inde.jade代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title 6 body 7 h3 欢迎学习jade 语法规则: 1, 标签按照html的缩进格式写 2

[js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin

强大的mixin mixin类似于函数的功能,可以达到模块复用的效果 mixin show: 定义一个类似函数的功能,名字叫show,里面的就是他的内容 +show: 调用show,每调用一次执行一次里面的内容 编译之后的结果: mixin也可以传递参数 编译之后的结果: mixin支持嵌套调用 编译之后的结果: mixin支持传递模块 编译之后的结果: mixin还可以传递属性 编译之后的结果: mixin支持传递不定参数 编译之后

Node.js 教程 05 - EventEmitter(事件监听/发射器 )

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会