Node.js EventEmmitter事件监 听 器用法实例分析
作者:司马懿字仲达 发布时间:2024-07-21 16:03:22
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/chy555chy/article/details/52586808


猜你喜欢
- 第一种--对象键值去重Array.prototype.unique1 = function () { var r
- 通过官方文档https://docs.djangoproject.com/zh-hans/3.1/topics/db/multi-db/和c
- 一、创建多对多1.学生表create table students ( id int not null primary
- 系列一:图片格式介绍Gif格式特点透明性Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha 透明)
- 你甚至可以在一行内将多个值赋值给多个变量>>> a , b = 45, 54>>> a45>>
- 本文实例为大家分享了python爬取微信公众号文章的具体代码,供大家参考,具体内容如下该方法是依赖于urllib2库来完成的,首先你需要安装
- 看代码~from django.contrib import messages messages.info(request, '要显
- Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学
- 我所希望的iframe功能是不要去控制父页面,如果他想要控制,哪从父页面里面加入什么代码能让他无法控制呢?假如iframe里面有这样的语句:
- 本文实例讲述了PHP简单实现冒泡排序的方法。分享给大家供大家参考,具体如下:<?php$files = array("fil
- 最近使用Python调用百度的REST API实现语音识别,但是百度要求音频文件的压缩方式只能是pcm(不压缩)、wav、opus、spee
- 前言要想让手机app自动登录,也就是让app自己操作。所以在脚本中我们需要对app控件进行操作,那么我们需要获取控件的信息。可以使用..\a
- 最近刚接触了公司的服务器,使用的是Windows 2003 server + IIS 6.0 服务器,在使用无组件上传文件时产生这个错误时:
- 前言React核心的单向数据流、一切皆数据的state、不会改变的props,以及状态提升等等经常使用便不多总结,需要的看官方文档。JSXJ
- 自封装的打码类, windows下建议用打码兔(调用的官方dll),linux下建议超人打码(http api)# coding:utf-8
- 一,直接保存pb1, 首先我们当然可以直接在tensorflow训练中直接保存为pb为格式,保存pb的好处就是使用场景是实现创建模型与使用模
- 这里主要是解决multipart/form-data这种格式的文件上传,基本现在http协议上传文件基本上都是通过这种格式上传1 思路一般情
- 本文实例讲述了Python编程实现控制cmd命令行显示颜色的方法。分享给大家供大家参考,具体如下:基于win7 + python3.4运行效
- 这篇文章主要介绍了Python二次规划和线性规划使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- Django View官方文档一个视图函数(类),简称视图,是一个简单的 Python 函数(类),它接受Web请求并且返回Web响应。响应