这节课讲一下事件模块
'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');