Node.js 事件发射器和监听器

可以使用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
余额不足,无法取款
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值