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

 更新时间:2017年09月28日 10:35:52   作者:NextStand   我要评论
Nodejs中不存在浏览器中冒泡,捕获这些行为,Nodejs中实现了events这个模块,Nodejs中大多数模块都集成了这个模块,所以events是Nodejs中最重要的一个模块。这篇文章主要给大家介绍了关于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');
//自定义一个对象继承于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也支持从url加载一个module详解

    如何使node也支持从url加载一个module详解

    这篇文章主要给大家介绍了关于如何使node也支持从url加载一个module的相关资料,文中通过示例代码将实现的方法介绍非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-06-06
  • node.js中的url.parse方法使用说明

    node.js中的url.parse方法使用说明

    这篇文章主要介绍了node.js中的url.parse方法使用说明,本文介绍了url.parse的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 浅析node应用的timing-attack安全漏洞

    浅析node应用的timing-attack安全漏洞

    本篇文章给大家通过原理的原因分析了node应用的timing-attack安全漏洞问题,有兴趣的朋友阅读参考下。
    2018-02-02
  • 详解nodejs模板引擎制作

    详解nodejs模板引擎制作

    本篇文章主要介绍了nodejs模板引擎制作 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 实例详解Node.js 函数

    实例详解Node.js 函数

    这篇文章主要介绍了Node.js 函数 ,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2018-06-06
  • 学习Node.js模块机制

    学习Node.js模块机制

    这篇文章主要为大家详细介绍了Node.js模块机制,一篇关于Node.js模块机制的学习笔记,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • node.js中的fs.mkdir方法使用说明

    node.js中的fs.mkdir方法使用说明

    这篇文章主要介绍了node.js中的fs.mkdir方法使用说明,本文介绍了fs.mkdir方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 详解node nvm进行node多版本管理

    详解node nvm进行node多版本管理

    这篇文章主要介绍了详解node nvm进行node多版本管理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • node.js中的fs.futimesSync方法使用说明

    node.js中的fs.futimesSync方法使用说明

    这篇文章主要介绍了node.js中的fs.futimes方法使用说明,本文介绍了fs.futimesSync方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 详解nodejs中的process进程

    详解nodejs中的process进程

    这篇文章主要介绍了nodejs中的process进程,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-03-03

最新评论