(译)Node.js的 EventEmitter 教程

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

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

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

你必须熟悉各类 Node.js 中的事件好比: on dataon endon error 等等之类的。事件机制的工做作得完美无缺,十分完美,难道不是吗?全部的基于事件的 Node.js 库都依赖于 EventEmitter 类,你可能会说那些库都继承了 EventEmitter函数

EventEmitter 的强大之处不只限于内置的 Node.js 库,你也能够拥有它!ui

展现 EventEmitter 能力的最好方法就是经过一个例子,看看这个:this

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 库变得可能。spa

上面的例子基于一个 EventEmitter 的实例,咱们怎么作才能建立一个继承自 EventEmitter 的类呢?Node.js 有一个,叫作 util 的库,它有一个方法: inherits,实现对象之间原型继承的函数。咱们能够很轻松的经过它让一个类继承另外一个类(准确的说不能叫类):prototype

var util = require('util');
util.inherits(MyClass, SuperClass);

使用 util.inherits() ,咱们建立了一个继承自 EventEmitter 的模块,注意下面的代码:翻译

radio.js 中的内容:code

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

相关文章
相关标签/搜索