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

来源:互联网 发布:淘宝朋友代付怎么没了 编辑:程序博客网 时间:2024/05/17 07:33

可以使用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();

输出:

12

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 0
原创粉丝点击