原文标题: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

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

  1. 从发布订阅模式入手读懂Node.js的EventEmitter源码

    前面一篇文章setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop详细讲解了浏览器和Node.js的异步API及其底层原理Event Loop.本文会讲一下不 ...

  2. [译]Node.js - Event Loop

    介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...

  3. Node.js:EventEmitter

    概要:本篇博客主要介绍EventEmitter Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列.事件由EventEmitter对象提供.下面通过一个例子来说明EventEmitt ...

  4. 基于node.js制作爬虫教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  5. Linux 安装node.js和npm教程

    前言:最近想做一款移动端的网站,在网上找了下,想用vue.js来提供技术支持,看了下安装教程,发现都是用npm来安装的,没办法,只能去装个npm了,之前没有装过这个包管理工具,这也是第一次安装吧,记录 ...

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

    events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...

  7. <node.js爬虫>制作教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  8. Node.js:EventEmitter类

    一.EventEmitter 类 Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时 ...

  9. [译]Node.js Interview Questions and Answers (2017 Edition)

    原文 Node.js Interview Questions for 2017 什么是error-first callback? 如何避免无止境的callback? 什么是Promises? 用什么工 ...

随机推荐

  1. SQL Server 输出受影响的行

    前期准备: create table Nums(X int); create table T(X int); go 目的:把对表Nums的insert | delete | update 反映到T表中 ...

  2. delphi高手突破学习笔记之面向对象类和对象的本质

    知识点1:堆和栈 每个应用程序可以获得的内存空间分为两种:堆(heap)和栈(stack). 堆又称为“自由存储区”,其中的内存空间的分配与释放是必须由程序员来控制的.例如,用GetMem函数获取了一 ...

  3. poj 3273 Monthly Expense (二分搜索,最小化最大值)

    题目:http://poj.org/problem?id=3273 思路:通过定义一个函数bool can(int mid):=划分后最大段和小于等于mid(即划分后所有段和都小于等于mid) 这样我 ...

  4. java文件读写操作

    Java IO系统里读写文件使用Reader和Writer两个抽象类,Reader中read()和close()方法都是抽象方法.Writer中 write(),flush()和close()方法为抽 ...

  5. 群星云集 BOSS上海时装秀—情沪魅影- 在线观看 - 乐视网

    群星云集 BOSS上海时装秀-情沪魅影- 在线观看 - 乐视网 群星云集 BOSS上海时装秀-情沪魅影

  6. java 请求响应乱码

    package org.operamasks.servlet; import java.io.IOException; import java.io.PrintWriter; import java. ...

  7. golang 之 defer(统计函数执行时间)

    package main import ( "fmt" "time" ) func sum(a ...int) int { defer trace(" ...

  8. HTML之学习笔记(七)列表

    html的列表分为有序列表,无序列表和自定义列表 1.有序列表(order list) 代码演示 <ol type="a"> <li>第一项数据</l ...

  9. Ext.Net 使用总结之查询条件中的起始日期

    2.关于查询条件中起始日期的布局方式 首先上一张图,来展示一下我的查询条件的布局,如下: 大多数时候,我们的查询条件都是一个条件占一个格子,但也有不同的时候,如:查询条件是起始日期,则需要将这两个条件 ...

  10. iOS 处理键盘遮挡TextField、TextView问题

    之前处理键盘遮挡问题都是在每一个控制器进行单独处理,这样做真的是非常的费事,今天在做项目的时候就想到自己封装一个,记录一下这个“跌宕起伏”的过程. 思路是这样的:计算文本编辑控件Frame与键盘Fra ...