欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Node.js EventEmmitter事件监听器用法实例分析

程序员文章站 2022-04-28 11:09:13
本文实例讲述了node.js eventemmitter事件监听器用法。分享给大家供大家参考,具体如下: node.js 所有的异步 i/o 操作在完成时都会发送一个事件...

本文实例讲述了node.js eventemmitter事件监听器用法。分享给大家供大家参考,具体如下:

node.js 所有的异步 i/o 操作在完成时都会发送一个事件到事件队列。

events 模块只提供了一个对象: events.eventemitter。eventemitter 的核心就是事件触发与事件监听器功能的封装。
该模块已被node.js默认引,不需要使用require()显示引入。

eventemitter 对象如果在实例化时发生错误,会触发 ‘error' 事件。当添加新的监听器时,'newlistener' 事件会触发,当监听器被移除时,'removelistener' 事件被触发。

一、on(event, listener)

为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

var myevent = new events.eventemitter();
var listener = function() {
  console.log('someevent emit');
}
myevent.on('someevent', listener);
//这里是lambda表达式
settimeout(() => myevent.emit('someevent'), 1000);

eventemitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,eventemitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

var myevent = new events.eventemitter();
myevent.on('someevent', function(arg1,arg2) { console.log('someevent 1 emit', arg1, arg2);});
myevent.on('someevent', (arg1,arg2) => console.log('someevent 2 emit', arg1, arg2));
myevent.emit('someevent', 'arg1', 'arg2');
/*
输出
someevent 1 emit arg1 arg2
someevent 2 emit arg1 arg2
*/

二、once(event, listener)

为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。

var myevent = new events.eventemitter();
myevent.once('someevent', function () {
  console.log('someevent emit');
});
myevent.emit('someevent');
/*
返回 true
输出 someevent emit
*/
myevent.emit('someevent');
//返回 false

三、removelistener(event, listener)

移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

var myevent = new events.eventemitter();
var listener = () => console.log('someevent emit');
myevent.on('someevent', listener);
myevent.removelistener('someevent', listener);
myevent.emit('someevent');
//返回 false

四、removealllisteners([event])

移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。

五、setmaxlisteners(n)

默认情况下, eventemitters 如果你添加的监听器超过 10 个就会输出警告信息。 setmaxlisteners 函数用于提高监听器的默认限制的数量。

六、listenercount(emitter, event)

返回指定事件的监听器数量。

var myevent = new events.eventemitter();
myevent.listenercount();
//输出 0
events.eventemitter.listenercount(myevent);
//输出 0
events.eventemitter.listenercount(myevent, 'someevent');
//输出 0
myevent.on('someevent', () => console.log('someevent emit'));
myevent.listenercount();
//输出 0
events.eventemitter.listenercount(myevent);
//输出 0
events.eventemitter.listenercount(myevent, 'someevent');
//输出 1

七、error 事件

eventemitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
当 error 被触发时,eventemitter 规定如果没有响 应的监听器,node.js 会把它当作异常,退出程序并输出错误信息。
我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。

var myevent = new events.eventemitter();
myevent.on('uncaughtexception', (err) => {
 console.log('whoops! there was an error');
});
myevent.emit('error', new error('whoops!'));
//输出 error: whoops!
myevent.on('error', (err) => {
 console.log('whoops! there was an error');
});
myevent.emit('error', new error('whoops!'));
//输出 whoops! there was an error

注意

大多数时候我们不会直接使用 eventemitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 eventemitter 的子类。

为什么要这样做呢?原因有两点:

1. 具有某个实体功能的对象实现事件符合语义, 事件的监听和发射应该是一个对象的方法。
2. javascript 的对象机制是基于原型的,支持 部分多重继承,继承 eventemitter 不会打乱对象原有的继承关系。

events(事件)模块是node.js的核心,许多其他模块用它来围绕着事件架构功能。由于node.js运行在单一的线程中,任何同步代码都是阻塞的,所以如果有长时间运行的代码的话事件循环便会被阻塞。为了有效地使用node.js编写代码,必须仔细思考自己的变成风格并遵循一些简单的规则。

  • 别阻塞——node.js是单线程的,如果代码阻塞的话所有其他的一切都会停止。
  • 快速返回——操作应当快速返回。如果不能快速返回,就应道将其移到另一个进程中。

希望本文所述对大家nodejs程序设计有所帮助。