【翻译】Node.js 教程 —— 事件模块

这节课讲一下事件模块

'app.js'
var stuff = require('./app.js');

上节课我们在一个 js 文件里引入自己写的模块如上,正如自定义模块一样,Node.js 自带很多内置的核心模块供我们使用,只需要用上方同样的方式引入。

先看其中一个事件模块,引入一个需要使用的核心模块只需要引入模块的名字,而非模块的路径,由于是核心模块,Node.js 会自动帮我们寻找对应的模块并返回。

'app.js'
var event = require('events');

事件模块其中一个属性是事件发生器(Event Emitter),可以使用它来创建自定义事件,针对该事件作出相应的处理。假如你使用过 jQuery,他们的事件是很相似的。

$('div').on('click', function(){}); // 当 div 触发了点击事件后,会执行里面注册的回调函数

同样的,Node.js 也可以创建自定义事件:
事件发生器是一个构造器,可通过它实例化一个事件发生器

'app.js'
var event = require('events');

var myEventEmitter = new event.EventEmitter();

可绑定自定义事件 myEvent,并通过 emit 方法传递事件名与参数进行手动触发,当事件触发时,执行里面的回调方法:

'app.js'
var event = require('events');

var myEventEmitter = new event.EventEmitter();

myEventEmitter.on('myEvent', function(message){
    console.log('myEvent ' + message);
});

myEventEmitter.emit('myEvent', 'is fired'); // myEvent is fired


再来一个稍微复杂点的例子来展示事件发生器的强大

  • 首先引入一个内置的工具类模块,能让我们从一个内置对象中进行继承
var util = require('util');
  • 创建一个构造器方法
var Person = function(name){
    this.name = name;
}
  • 需要让 Person 继承 EventEmitter。使用 util 的 inherits 方法来进行继承。
    • 第一个参数是需要继承的构造器
    • 第二个是继承自哪里
util.inherits(Person, event.EventEmitter)

这样后只要创建的 Person 对象,都会继承 EventEmitter

  • 实例化几个 Person,并放入数组里面来循环绑定事件
var kirin = new Person('kirin');
var goku = new Person('goku');
var gohan = new Person('gohan');

var people = [kirin, goku, gohan];

people.forEach(function (person) {
    person.on('speak', function (msg) {
        console.log(this.name + ' say: ' + msg);
    });
});
  • 最后手动触发 speak 事件并传递参数
kirin.emit('speak', 'hi goku');
goku.emit('speak', 'hi kirin');

最终代码

'app.js'
var event = require('events');
var util = require('util');

var Person = function (name) {
    this.name = name;
}

util.inherits(Person, event.EventEmitter)

var kirin = new Person('kirin');
var goku = new Person('goku');
var gohan = new Person('gohan');

var people = [kirin, goku, gohan];

people.forEach(function (person) {
    person.on('speak', function (msg) {
        console.log(this.name + ' say: ' + msg);
    });

});

kirin.emit('speak', 'hi goku');
goku.emit('speak', 'hi kirin');

你可能感兴趣的:(【翻译】Node.js 教程 —— 事件模块)