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