可以使用Node.js的内置模块创建自定义事件,并实现当一个事件被触发时执行的监听器回调。
1 将自定义事件添加到JavaScript对象上
事件使用一个EventEmitter对象来发出。这个对象包含在events模块中。emit(eventName, [args])函数触发eventName事件,包括所提供的参数。下面代码展示了如何实现一个简单的事件发射器:
var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('simpleEvent');
可以这样把事件添加到JS对象上。
var events = require("events");
var util = require('util');
function Obj() {
this.do = function () {
console.log(1);
this.emit('consoled');
}
}
util.inherits(Obj, events.EventEmitter);
这样便在对象Obj的do()函数上定义了一个consoled事件,每当调用Obj对象实例的do()函数便发射出事件“consoled”。
2 把事件监听器添加到对象上
一旦有了一个可以发出事件的对象实例,便可以为对象实例添加事件监听器监听所关心的事件,事件监听器有如下3中方式:
- .addListener(eventName, callback);
- .on(eventName, callback);
- once(eventName, callback); 这个是只有eventName事件第一次被触发时,回调函数才被放置在事件队列中执行。
可以为Obj对象实例这样添加监听器:
var obj = new Obj();
obj.on('consoled', function () {
console.log(2);
});
obj.do();
输出:
1
2
3 示例程序:
var events = require("events");
var util = require('util');
function Account() {
this.balance = 0;
this.deposite = function (amount) {
this.balance += amount;
this.emit('balanceChanged');
}
this.withDraw = function (amount) {
if (this.balance > 0) {
this.balance -= amount;
this.emit('balanceChanged');
} else {
return;
}
}
}
util.inherits(Account, events.EventEmitter);
function displayBalance() {
console.log("账户余额:%d", this.balance);
}
function checkOverDraw(self) {
if (self.balance <= 0) {
console.log("余额不足,无法取款");
return false;
}
return true;
}
var account = new Account();
account.on("balanceChanged", displayBalance);
account.on("balanceChanged", function () {
if (checkOverDraw(this)) {
console.log("存款可取");
}
});
account.deposite(300);
account.deposite(600);
account.deposite(500);
account.withDraw(1400);
account.withDraw(200);
输出:
账户余额:300
存款可取
账户余额:900
存款可取
账户余额:1400
存款可取
账户余额:0
余额不足,无法取款