Node.js V6.9.4
Node.js核心API的大部份是围绕1个异步事件驱动架构构建的,因此Events模块是很多模块的基础,很多模块都是基于Events模块建立的,
例如:net.Server对象每当对等体连接到它时发出1个事件; fs.ReadStream在打开文件时发失事件; 每当数据可用于读取时,流发失事件。
所有发失事件的对象都是EventEmitter类的实例。这些对象公然了1个EventEmitter.on()函数,它允许1个或多个函数附加到对象发出的命名空间。
我们可以为1个事件对象注册多个事件,可以为1个事件注册多个监听器
1.Events模块基本用法
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => { //注册1个名为'event'的事件
console.log('an event occurred!');
});
//触发名为'event'的事件
myEmitter.emit('event'); // => 'an event occurred!'
2.同步与异步
* EventEmitter依照事件的注册顺序同步的调用监听器,如果想切换到异步模式,使用setImmediate()或process.nextTick() *
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('this happens asynchronously'); // 该事件会异步触发
});
});
myEmitter.emit('event', 'a', 'b');
3.Error events
* 当事件队列中产生毛病或没有为毛病事件注册监听器,则利用会抛出1个’error’事件,并且程序会退出 *
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!')); // 抛出毛病并且程序退出
* 避免抛出毛病时,进程崩溃,可以为进程注册1个uncaughtException事件,用来处理毛病,避免程序崩溃 *
const myEmitter = new MyEmitter();
process.on('uncaughtException', (err) => {
console.log('whoops! there was an error');
});
//进程不会崩溃
myEmitter.emit('error', new Error('whoops!')); // => 'whoops! there was an error'
* 最好实践:应当始终为监听器注册1个’error’事件 *
const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!')); // => 'whoops! there was an error'
4.Event经常使用API介绍
* const EventEmitter = require(‘events’) *
* const myEE = new EventEmitter() *
方法 | 作用 |
---|---|
myEE.on(‘eventName’, listener) | 为当前实例对象的某个事件注册监听器 |
myEE.emit(eventName[, …args]) | 顺序触发当前实例对象某个事件的所有监听器 |
myEE.once(eventName, listener) | 设置当前实例对象的某个事件的监听器只触发1次 |
myEE.addListener(eventName, listener) | 为当前实例对象的某个事件增加监听器 |
myEE.eventNames() | 返回当前实例对象的所有的注册事件(按注册顺序) |
myEE.getMaxListeners() | 返回当前实例对象可以设置的最大监听器数量 |
myEE.listenerCount(eventName) | 返回当前实例对象的某个事件的监听器数量 |
myEE.listeners(eventName) | 以数组情势返回当前实例对象的某个事件的所有监听器 |
myEE.removeAllListeners([eventName]) | 删除当前对象的某个事件的所有监听器 |
myEE.removeListener(eventName, listener) | 删除当前对象的某个事件的某个监听器 |
myEE.setMaxListeners(n) | 设置监听器的最大数量 |
下一篇 一个女程序员眼中的程序员