前言

本文主要给大家介绍了关于node.js事件模块Events使用的一些示例,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
环境:Node v8.2.1; Npm v5.3.0; OS Windows10
1、 Node事件介绍
Node大多数核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)。
所有能触发事件的对象都是 EventEmitter 类的实例。 这些对象开放了一个 eventEmitter.on() 函数,允许将一个或多个函数绑定到会被对象触发的命名事件上。 事件名称通常是驼峰式的字符串,但也可以使用任何有效的 JavaScript 属性名。
当 EventEmitter 对象触发一个事件时,所有绑定在该事件上的函数都被同步地调用。 监听器的返回值会被丢弃。
2、events 模块API介绍
3、 一些例子
下面是一些简单的例子,对应上面的API的一个代码实现
3.1 绑定和触发事件
const EventEmitter = require('events');
//自定义一个对象继承于EventEmitter
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发了一个事件!');
});
myEmitter.emit('event');
3.2 为事件传递参数
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', (a,b) => {
console.log(a,b);
//1,2
});
myEmitter.emit('event','a','b');
3.3 this 的问题
当一个普通的监听器函数被 EventEmitter 调用时,标准的 this 关键词会被设置指向监听器所附加的 EventEmitter。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', function() {
console.log(this);
/*
a b MyEmitter {
domain: null,
_events: { event: [Function] },
_eventsCount: 1,
_maxListeners: undefined
}
*/
});
myEmitter.emit('event');
也可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log(this);
//{}
});
myEmitter.emit('event');
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
改变指定的 EventEmitter 实例的监听器限制
const EventEmitter = require('events')
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter();
myEmitter.setMaxListeners(13);
for (let i = 0; i < 11; i++) {
myEmitter.on("event", () => {
console.log(i);
});
}
myEmitter.emit("event")
3.8 newListener事件
EventEmitter 实例会在一个监听器被添加到其内部监听器数组【之前】触发自身的 ‘newListener' 事件
const EventEmitter = require('events')
class MyEmitter extends EventEmitter { }
const myEmitter = new MyEmitter()
myEmitter.once("newListener", (event, listener) => {
if(event === "event"){
myEmitter.on("event",()=>{
console.log("B");
})
}
});
myEmitter.on("event",()=>{
console.log("A");
});
myEmitter.emit("event")
/*
B
A
*/
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
# node
# events模块
# nodejs
# 事件模块
# Node.js中的events事件模块知识点总结
# node.JS事件机制与events事件模块的使用方法详解
# node.js中事件触发器events的使用方法实例分析
# 关于Node.js的events.EventEmitter用法介绍
# Node.js内置模块events事件监听发射详解
# 关键词
# 可以使用
# 绑定
# 抛出
# 都是
# 多个
# 将会
# 说了
# 不多
# 会在
# 有一定
# 给大家
# 但也
# 自定义
# 这篇文章
# 谢谢大家
# 为了防止
# 并使
# 一个普通
# 发生错误
相关文章:
Swift中循环语句中的转移语句 break 和 continue
已有域名和空间如何搭建网站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
建站之星如何防范黑客攻击与数据泄露?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
jQuery 常见小例汇总
建站之星如何快速解决建站难题?
如何续费美橙建站之星域名及服务?
C#怎么创建控制台应用 C# Console App项目创建方法
建站之星各版本价格是多少?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
建站之星如何优化SEO以实现高效排名?
宝塔建站无法访问?如何排查配置与端口问题?
如何快速生成高效建站系统源代码?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
油猴 教程,油猴搜脚本为什么会网页无法显示?
常州自助建站工具推荐:低成本搭建与模板选择技巧
,柠檬视频怎样兑换vip?
建站之星如何配置系统实现高效建站?
如何配置IIS站点权限与局域网访问?
,怎么在广州志愿者网站注册?
深圳网站制作平台,深圳市做网站好的公司有哪些?
装修招标网站设计制作流程,装修招标流程?
建站之星免费版是否永久可用?
深圳网站制作案例,网页的相关名词有哪些?
,在苏州找工作,上哪个网站比较好?
微信小程序 五星评分(包括半颗星评分)实例代码
如何在云指建站中生成FTP站点?
如何自定义建站之星网站的导航菜单样式?
如何在IIS中新建站点并解决端口绑定冲突?
如何在云服务器上快速搭建个人网站?
建站主机空间推荐 高性价比配置与快速部署方案解析
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
制作农业网站的软件,比较好的农业网站推荐一下?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
婚礼视频制作网站,学习*后期制作的网站有哪些?
网站设计制作企业有哪些,抖音官网主页怎么设置?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
建站之星后台密码遗忘或太弱?如何重置与强化?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
西安专业网站制作公司有哪些,陕西省建行官方网站?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何在服务器上三步完成建站并提升流量?
如何在IIS管理器中快速创建并配置网站?
如何获取上海专业网站定制建站电话?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
如何通过商城免费建站系统源码自定义网站主题?
宝塔建站后网页无法访问如何解决?
广州营销型建站服务商推荐:技术优势与SEO优化解析
,有什么在线背英语单词效率比较高的网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。