node.js学习之事件模块Events的使用示例(2)
3.4 异步执行
EventListener 会按照监听器注册的顺序同步地调用所有监听器,监听器函数可以使用 setImmediate() 或 process.nextTick() 方法切换到异步操作模式:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', (a,b) => {
setImmediate(()=>{
//异步触发
console.log(a,b);
})
console.log("c");
});
myEmitter.emit('event','a','b');
//c
//a b
3.5 无限次触发和一次触发
事件默认是可以无限次数的触发的,只要触发一次,对应的监听函数就执行一次;有时候我们希望只执行一次监听函数,可以使用【once】对事件进行绑定
多次触发:
const EventEmitter = require('events')
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {
console.log(++m);
});
myEmitter.emit('event'); //1
myEmitter.emit('event'); //2
myEmitter.emit('event'); //3
一次触发:
const EventEmitter = require('events')
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event'); //1
myEmitter.emit('event'); //忽略
myEmitter.emit('event'); //忽略
3.6 错误事件
当 EventEmitter 实例中发生错误时,会触发一个 ‘error' 事件,如果 EventEmitter 没有为 ‘error' 事件注册至少一个监听器,则当 ‘error' 事件触发时,会抛出错误、打印堆栈跟踪、且退出 Node.js 进程。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
myEmitter.emit("error", new Error('whoops!'));
// 抛出错误,并使 Node.js 崩溃
为了防止 Node.js 进程崩溃,可以在 process 对象的 uncaughtException 事件上注册监听器
const EventEmitter = require('events')
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
//在进程上面注册错误监听,使进程不崩溃
process.on("uncaughtException",()=>{
console.error('有错误');
});
myEmitter.emit("error",new Error("whoops"))
上面这样的方式并不是最佳实践,最好是为【error】注册监听函数
3.7 获取和修改最大事件监听数量
Node默认一个事件的监听数量为10个,超过十个将会发出警告
const EventEmitter = require('events')
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
console.log(EventEmitter.defaultMaxListeners); //10
for (let i = 0; i < 11; i++) {
myEmitter.on("event", () => {
console.log(i);
});
}
myEmitter.emit("event")
//MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 event listeners added. Use emitter.setMaxListeners() to increase limit
内容版权声明:除非注明,否则皆为本站原创文章。
