(译)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 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
(完)
翻译水平有待提高,所翻译的博文并不是按照原文一句一句翻译,而是添加了自己对文章的理解。如有不正之处,欢迎指正!
个人笔记,仅供参考。
参考:
http://www.hacksparrow.com/node-js-eventemitter-tutorial.html
(译)Node.js的 EventEmitter 教程的更多相关文章
- 从发布订阅模式入手读懂Node.js的EventEmitter源码
前面一篇文章setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop详细讲解了浏览器和Node.js的异步API及其底层原理Event Loop.本文会讲一下不 ...
- [译]Node.js - Event Loop
介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...
- Node.js:EventEmitter
概要:本篇博客主要介绍EventEmitter Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列.事件由EventEmitter对象提供.下面通过一个例子来说明EventEmitt ...
- 基于node.js制作爬虫教程
前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...
- Linux 安装node.js和npm教程
前言:最近想做一款移动端的网站,在网上找了下,想用vue.js来提供技术支持,看了下安装教程,发现都是用npm来安装的,没办法,只能去装个npm了,之前没有装过这个包管理工具,这也是第一次安装吧,记录 ...
- 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...
- <node.js爬虫>制作教程
前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...
- Node.js:EventEmitter类
一.EventEmitter 类 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时 ...
- [译]Node.js Interview Questions and Answers (2017 Edition)
原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...
随机推荐
- [问题解决] "Nautilus could not create the required folder "/home/kenneth/.config/nautilus"
错误: "Nautilus could not create the required folder "/home/kenneth/.config/nautilus" 发 ...
- 适配iPad的操作表sheet
在 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"上传文件" message:@ ...
- a中国天气网pi(json格式)
http://m.weather.com.cn/data/101050101.html 此接口的回报格式例如以下 { "weatherinfo": { "city&quo ...
- C#Excel导出导入
using System; using System.Collections.Generic; using NPOI; using NPOI.HPSF; using NPOI.HSSF; using ...
- 在win7下装ubuntu(硬盘版安装)及遇到的问题
都怪自己弄什么Ubuntu下的Android Studio,因为GFW,gradle总下载不了,用命令行下载一半关机了,然后Ubuntu就这样被我搞残废了.又张罗着重装. 其实就是参照网上的帖子,算是 ...
- Archlinux 安装配置指导 2015-05-24
因为用的Linode VPS的系统是Archlinux的,想在本地弄个系统做测试用,这样比较方便.然后发现自己在6年前做的一个Archlinux 安装配置Flash,好怀念的赶脚. 时过进迁,没想到A ...
- SQL 语句优化—— (二) 索引的利用
索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.与书中的索引一样,数据库中的索引使您可以快速找到表或索引视图中的特定信息.索引包含从表或视 ...
- 防止自己的网站被别人frame引用造成钓鱼
自己负责的某一网站,最近被不法份子通过<frame>的方式引入,用户点击对方的域名后,看到的内容跟自己网站一模一样.但是右击查看源码就会发现其中的原理: <!DOCTYPE HTML ...
- springmvc入门demo
目录结构: package com.wyl; import org.springframework.stereotype.Controller; import org.springframework. ...
- jQuery Validate W3C内容
导入 js 库 <script src="../js/jquery.js" type="text/javascript"></script&g ...