Node.js事件和Events模块(Node.js自学第八天)

532 阅读3分钟

Node.js中添加新的事件回调函数事件队列,可以使用下述五种方法之一:
(1)原生模块预定义的事件和事件监听;
(2)异步I/O库;
(3)定时器回调;
(4)全局对象process.nextTick()函数;
(5)自定义事件。

添加事件回调函数

原生模块预定义事件

socket.on('close',()=>{
	console.log('connection closed');
  var index=socket.indexOf(socket);
  //服务器端断开连接
  sockets.splice(index,1);
})

异步IO库

var mysql=require('mysql');
var pool=mysql.createPool(config);

pool.getConnection((err,connection)=>{
	connection.query('SELECT something FROM sometable',(err,rows)=>{
  	//处理数据
    connection.end();
  })
})

定时器添加回调函数

var timer=setInterval(()=>{
	//周期性任务
  if(退出条件){
  	clearInterval(timer);
  }
},1000)
var timer=setTimeout(()=>{
	//一次性任务
},1000);

process.nextTick( )

console.log('start');
process.nextTick(()=>{
	console.log('nextTick callback');
})
console.log('scheduled');

events模块

Node.js原生模块之一的events模块,提供了EventEmitter类型,Node.js中所有可以触发事件的对象都最终继承自这个对象。

方法名 说明
addListener(event,listener) 为指定事件绑定监听函数
on(event,listener) 为指定事件绑定监听函数
once(event,listener) 为事件绑定只能执行一次的监听函数
removeListener(event,listener) 删除指定事件的监听函数
removeAllListeners(event) 删除指定事件所有的监听函数
setMaxListenners(n) 设置事件处理函数最大数量(基于内存泄漏的考虑默认情况下最多绑定10个监听函数)
listeners(event) 获取指定事件所有的监听函数
emit(event,[arg1],[arg2],...) 手工出发指定事件

自定义事件

const events=require('events');
var emitter=new events();

emitter.on('some_event',()=>{		//绑定事件回调
    console.log("事件被触发了...")
})
emitter.addListener('some_event',()=>{		//绑定事件回调
    console.log("事件又被触发了...")
})
setTimeout(()=>{
    emitter.emit('some_event');			//触发事件
},2000);
//等待两秒
//事件被触发了...
//事件又被触发了...

继承EventEmitter

"use strict"
const events=require('events');
class DBConnection extends events{
    close(){
        this.emit('close')//触发事件
    }
}
var conn=new DBConnection();
conn.on('close',()=>{//绑定监听函数
    console.log('数据库连接关闭成功!');
})
setTimeout(()=>{
    conn.close();
},1000);
//数据库连接关闭成功!

事件传参

const events=require("events");
const myEmitter=new events();

myEmitter.on('myevent',function(a,b){
    console.log(a,b,this);
    //若此处使用了箭头函数,则this不再指向myEmitter
});
myEmitter.emit('myevent',10,20)

错误事件

如果事件名称为error,且接受的参数是一个Error对象,则会导致Node.js解释器退出执行;可以监听error事件以解决此问题:

const events=require('events');
const myEmitter=new events();
myEmitter.on('error',(err)=>{
	console.log('An Error Occured!');
})
myEmitter.emit("error",new Error('err msg!'));

一次性事件

可以使用once()代替on()声明只能监听一次的事件:

const events=require('events');
const myEmitter=new events();

var counter=0;
myEmitter.once("add",()=>{
    console.log(++counter);
})
myEmitter.emit("add");
myEmitter.emit("add");
//1(只有一次输出,第二次触发事件无效)

监听器数量

由于可能引起内存泄漏,Node.js默认情况下对一个对象的某个事件最多允许设置10个监听函数,超过限制了只能用setMaxListenners函数进行修改。

取消监听函数数量限制:

myEmitter.setMaxListener(0);

返回指定对象上指定事件的监听函数数量:

events.listenerCount(myEmitter,'add')
//1