node之Events模块

Events模块是Node对“发布/订阅”模式(publish/subscribe)的实现。一个对象通过这个模块,向另一个对象传递消息。

Node中的Event模块仅仅提供了一个对象: EventEmitter, EventEmitter 的核心就是事件触发与事件监听器功能的封装。

获取EventEmitter对象

//引用模块events, 点语法获取到EventEmitter
var EventEmitter = require('events').EventEmitter;
//初始化一个对象, 这个实例就是消息中心。
var emitter = new EventEmitter;

第二 EventEmitter 实例对象的方法

2.1 emitter.on(eventName, listener), 监听事件,如果触发就调用回调函数

1. eventName <String> | <Symbol>: 事件名称, 后边可以跟上函数;
2. listener <Function> : 回调函数;

2.2 emitter.emit(eventName[, ...args]), 根据eventName发送通知, 触发事件, 第一个参数为事件名称, 其余的参数会依次传入回调函数

以上两个方法的示例代码

var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

//监听函数1, 事件名为--fun1
emitter.on('fun1', function(){
    console.log('触发函数1');
});

//定义有参数函数fun2, 
var fun2 = function(para){
    console.log('触发函数2, 参数为' + para);
};
//监听fun2
emitter.on('fun2', fun2);

//触发事件名
emitter.emit('fun1');
//触发事件名并且传参数
emitter.emit('fun2', 'event');

打印结果为:

$ node 2on.js 
触发函数1
触发函数2, 参数为event

2.3 emitter.once(eventName, listener), 类似on方法, 但回调函数只是执行一次

var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

emitter.once('oncefun', function(){
    console.log('函数只执行一次');
});
emitter.emit('oncefun');
emitter.emit('oncefun');

console.log('--------')

emitter.on('fun', function(){
    console.log('函数');
});
emitter.emit('fun');
emitter.emit('fun');

执行的结果为:

$ node 3once.js 
函数只执行一次
函数
函数

虽然触发多次oncefun, 但依然打印一次;与下边形成对比;,

2.4 emitter.addListener(eventName, listener)类似于emitter.on(eventName, listener)

2.5 emitter.removeListener(eventName, listener), 移除监听

详细见实例代码:

var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

//定义一个函数
var removeFun = function(){
    console.log('输出结果');
}
//以fun名称监听removeFun
emitter.on('fun', removeFun);
//每个30毫秒触发一次回调函数
setInterval(function(){
    emitter.emit('fun');
}, 30);
//200毫秒以后触发回调函数
setTimeout(function(){
    emitter.removeListener('fun', removeFun);
}, 200);

打印结果

$ node 5removeListener.js 
输出结果
输出结果
输出结果
输出结果
输出结果

#光标停止

第三部分 更多API详见

语法名称觉得挺好的, 见名知意. 更多的语法就看Node官网吧 -__-

Event: 'newListener'
Event: 'removeListener'
EventEmitter.listenerCount(emitter, eventName)
EventEmitter.defaultMaxListeners
emitter.addListener(eventName, listener)
emitter.emit(eventName[, ...args])
emitter.eventNames()
emitter.getMaxListeners()
emitter.listenerCount(eventName)
emitter.listeners(eventName)
emitter.on(eventName, listener)
emitter.once(eventName, listener)
emitter.prependListener(eventName, listener)
emitter.prependOnceListener(eventName, listener)
emitter.removeAllListeners([eventName])
emitter.removeListener(eventName, listener)
emitter.setMaxListeners(n)



作者:HowardHuang
链接:https://www.jianshu.com/p/fd1f8c998a2c
 

猜你喜欢

转载自blog.csdn.net/QQ_Empire/article/details/81458502