当前位置:首页 > 日记 > 正文

node.js学习之事件模块Events的使用示例

node.js学习之事件模块Events的使用示例

前言

本文主要给大家介绍了关于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');//自定义一个对象继承于EventEmitterclass 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'); //1myEmitter.emit('event'); //2myEmitter.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'); //1myEmitter.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); //10for (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")/*BA*/

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

相关文章

Node.js 使用流实现读写同步边读边

Node.js 使用流实现读写同步边读边

读写,同步,功能,电脑软件,Node,废话不多说了,直接给大家贴代码了,具体代码如下所示://10个数 10个字节,每次读4b,写1blet fs=require("fs");function pipe(source,target) { //先创建可读流,再创建可写流 //先读一次,rs.on(data) //将读到的…

Angular.js中下拉框实现渲染html的

Angular.js中下拉框实现渲染html的

方法,下拉框,电脑软件,Angular,js,前言大家都知道angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击。但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框代码如下:<body ng-app="app" ng-controller="cont…

微信小程序实现tab切换效果

微信小程序实现tab切换效果

效果,程序,电脑软件,微信小,tab,微信小程序之tab切换效果,如图:最近在学习微信小程序并把之前的公司app搬到小程序上,挑一些实现效果记录一下(主要是官方文档里没说的,毕竟官方文档只是介绍功能).wxml代码:<view class="body"> <view class="na…

如何将ps软件进行汉化

如何将ps软件进行汉化

方法,汉化,如何将,电脑软件,ps,  ps软件相信你很多同学都知道还有别的语言版本,如果下载的不是汉语可以进行汉化的。但是很多同学还不太清楚。那么接下来下面是小编整理的一些关于如何将ps软件进行汉化,供您参阅。将ps软件进行汉化的方法首…

PS制作唯美炫光金粉效果的圣诞文字

PS制作唯美炫光金粉效果的圣诞文字

教程,文字,金粉,圣诞,唯美,的文字特效学习者和未来的设计师们,大家好。下面的教程主要是教大家使用Photoshop来制作一个非常炫的金粉效果的圣诞文字。这样的金粉效果挺漂亮的,大家也可以把它运用到夜店的海报设计,或者电商设计当中。缺点是这…

powerpoint中柱状图怎么做

powerpoint中柱状图怎么做

柱状图,方法,怎么做,中做,电脑软件,  ppt中经常用到图表,比如柱形图、圆饼图等,这些图就是基于一定的数据建立起来的,所以我们得先建立数据表格然后才能生成图表,那么ppt中怎么做柱状图?下面给大家分享吧。在ppt中做柱状图的方法1. 打开excel…

30款最新的2018新年宣传单/海报/贺

30款最新的2018新年宣传单/海报/贺

宣传单,海报,新年,最新,电脑软件,接下来请的各位朋友欣赏30款最新的2018新年宣传单/海报/贺卡设计,包括新年快乐宣传单、新年庆祝宣传单、新年销售宣传单、新年庆祝啤酒聚会宣传单、新年倒计时宣传单、新年销售宣传单及新年聚会庆祝海报、除…

js实现移动端导航点击自动滑动效果

js实现移动端导航点击自动滑动效果

移动端,滑动效果,导航,电脑软件,js,本文实例为大家分享了js实现移动端导航点击滑动效果的具体代码,供大家参考,具体内容如下移动端模拟导航可点击自动滑动 0.1.4。导航可左右滑动,可点击边缘的一个,自动滚动下一个到可视范围【依赖于iscroll.js…

基于ASP.NET Core数据保护生成验证

基于ASP.NET Core数据保护生成验证

验证,数据保护,示例,电脑软件,NET,ASP.NET Core Data Protection 不仅提供了非对称加密能力,而且提供了灵活的秘钥存储方式以及一致的加解密接口(Protect与Unprotect)。Session中用到了它,Cookie验证中用到了它,OpenIdConnect中也用到了它。。。…

软件测试面试如何测试一个杯子

软件测试面试如何测试一个杯子

软件测试,杯子,测试,电脑软件,软件测试面试如何测试一个杯子在软件测试的面试中, 经常会碰到类似的问题。 比如:如何测试一个杯子, 或者如何测试一只笔。 要求你设计20个以上的test case.这类的面试题目,是考察面试者是否熟悉各种软件测试方法, …

chorme 浏览器记住密码后input黄色

chorme 浏览器记住密码后input黄色

处理方法,浏览器,记住密码,两种,黄色,使用chrome浏览器选择记住密码的账号,输入框会自动加上黄色的背景,有些设计输入框是透明背景的,需要去除掉这个黄色的背景;方法1:阴影覆盖input:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px whit…

Photoshop只需几步画出箭头

Photoshop只需几步画出箭头

只需,箭头,几步,画出,电脑软件,Photoshop作为一个强大的修图软件,其功能也是极其强大,需要花很多时间、精力去摸索、学习,我们往往会在很多图中看到箭头指示的图标,那么,用Photoshop该如何画箭头呢,下面由我来教你。步骤:1、首先打开Photoshop软件…