广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Node中的Events模块介绍及应用
  • 198
分享到

Node中的Events模块介绍及应用

NodeEventsNodeEvents模块 2022-11-13 14:11:19 198人浏览 独家记忆
摘要

目录node 中的 Events1. 事件和监听器2. 处理 error 事件3. 继承 Events 模块4. 手写 EventEmitterNode 中的 Events Node

Node 中的 Events

Node 的 Events 模块只定义了一个类,就是 EventEmitter(以下简称 Event ),这个类在很多 Node 本身以及第三方模块中大量使用,通常是用作基类被继承。

在 Node 中,事件的应用遍及代码的每一个角落。

1. 事件和监听器

Node 程序中的对象会产生一系列的事件,它们被称为事件触发器(event emitter),例如一个 Http Server 会在每次有新连接时触发一个事件,一个 Readable Stream 会在文件打开时触发一个事件等。

所有能触发事件的对象都是 EventEmitter 类的实例。EventEmitter 定义了 on 方法,该方法的声明如下:

emitter.on(eventName, listener)
eventName <String> | <Symbol> The name of the event.
listener <Function> The callback function

on 方法接受两个参数:需要监听的事件的名称,当事件触发时需要调用的函数。因为 EventEmitter 是接口,从 EventEmitter 继承的类需要使用 new 关键字来构造。

触发事件监听器很简单,只要调用 EventEmitter实例的 emit 方法就行了。需要注意的是,这些事件是针对某个实例的,不存在全局的事件。当你调用 on 方法的时候,需要绑定在特定的基于 EventEmitter 的对象上。EventEmitter 类不同的实例之间也不会共享事件。

下面是一个事件注册和触发事件的例子。

const eventEmitter = require('events');
const myEmitter = new eventEmitter();
myEmitter.on('begin', () => {
  console.log('begin');
});
myEmitter.emit('begin');

上面的代码中,首先初始化了一个 EventEmitter 实例,然后注册了一个名为 begin 的事件,之后调用 emit 方法触发了这一事件。

用户可以注册多个同名的事件,在上面的例子中,如果注册两个名为 begin 的事件,那么它们都会被触发。

如果想获取当前的 emitter 一共注册了哪些事件,可以使用 eventNames 方法。

console.log(myEmitter.eventNames());

该方法会输出包括全部事件名称的数组。就算注册了两个同名的 event,输出结果也只有一个,说明该方法的结果集并不包含重复结果。

2. 处理 error 事件

由于 Node 代码运行在单线程环境中,那么运行时出现的任何错误都有可能导致整个进程退出。利用事件机制可以实现简单的错误处理功能。

当 Node 程序出现错误的时候,通常会触发一个错误事件,如果代码中没有注册相应的处理方法,会导致 Node 进程崩溃退出。例如:

myEmitter.emit("error", new Error("crash!"));

上面的代码主动抛出了一个 emor,相当于:

throw new Error ("crash");

如果我们不想因为抛出一个 error 而使进程退出,那么可以让 uncaughtException 事件作为最后一道防线来捕获异常。

const eventEmitter = require('events');
const myEmitter = new eventEmitter();
process.on('uncaughtException', () => {
  console.log('Got error');
});
throw new Error('Error occurred');

这种错误处理的方式虽然可以捕获异常,避免了进程的退出,但不值得提倡。

关于其常见的方法如下:

  • emitter.addListener/on(eventName, listener) :添加类型为 eventName 的监听事件到事件数组尾部
  • emitter.prependListener(eventName, listener):添加类型为 eventName 的监听事件到事件数组头部
  • emitter.emit(eventName[, ...args]):触发类型为 eventName 的监听事件
  • emitter.removeListener/off(eventName, listener):移除类型为 eventName 的监听事件
  • emitter.once(eventName, listener):添加类型为 eventName 的监听事件,以后只能执行一次并删除
  • emitter.removeAllListeners([eventName]): 移除全部类型为 eventName 的监听事件

3. 继承 Events 模块

在实际的开发中,通常不会直接使用 Event 模块来进行事件处理,而是选择将其作为基类进行继承的方式来使用 Event,在 Node 的内部实现中,凡是提供了事件机制的模块,都会在内部继承 Event 模块。

4. 手写 EventEmitter

下面我们来看看如何手写一个 EventEmitter

class EventEmitter {
  constructor() {
    this.events = {};
  }
  on(type, handler) {
    if (!this.events[type]) {
      this.events[type] = [];
    }
    this.events[type].push(handler);
  }
  addListener(type, handler) {
    this.on(type, handler)
  }
  prependListener(type, handler) {
    if (!this.events[type]) {
      this.events[type] = [];
    }
    this.events[type].unshift(handler);
  }
  removeListener(type, handler) {
    if (!this.events[type]) {
      return;
    }
    this.events[type] = this.events[type].filter(item => item !== handler);
  }
  off(type, handler) {
    this.removeListener(type, handler)
  }
  emit(type, ...args) {
    this.events[type].forEach((item) => {
      Reflect.apply(item, this, args);
    });
  }
  once(type, handler) {
    this.on(type, this._onceWrap(type, handler, this));
  }
  _onceWrap(type, handler, target) {
    const state = {
      fired: false,
      handler,
      type,
      target
    };
    const wrapFn = this._onceWrapper.bind(state);
    state.wrapFn = wrapFn;
    return wrapFn;
  }
  _onceWrapper(...args) {
    if (!this.fired) {
      this.fired = true;
      Reflect.apply(this.handler, this.target, args);
      this.target.off(this.type, this.wrapFn);
    }
  }
}

到此这篇关于Node中的Events事件介绍及应用的文章就介绍到这了,更多相关Node Events内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Node中的Events模块介绍及应用

本文链接: https://www.lsjlt.com/news/171951.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node中的Events模块介绍及应用
    目录Node 中的 Events1. 事件和监听器2. 处理 error 事件3. 继承 Events 模块4. 手写 EventEmitterNode 中的 Events Node...
    99+
    2022-11-13
    Node Events Node Events模块
  • Node的events模块怎么使用
    这篇文章主要介绍了Node的events模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node的events模块怎么使用文章都会有所收获,下面我们一起来看看吧。在 vue 的项目中,有时我们会用到全...
    99+
    2023-07-05
  • 浅析node Async异步处理模块用例分析及常用方法介绍
    最近在研究nodejs,令我感受比较深的是……熟悉js代码的地球人都知道,js的加载顺序很重要!很重要!!那么问题来了,在编写node的时候,会在后台去请求很多接口(我们公司是与java后台交接数据的),接...
    99+
    2022-06-04
    模块 常用 方法
  • Java中工厂模式的介绍及应用
    本篇内容介绍了“Java中工厂模式的介绍及应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!介绍意图:提供一个创建一系列相关或相互依赖对象的...
    99+
    2023-06-05
  • Python中os模块的用法介绍
    今天小编给大家分享的是Python中os模块的用法介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。1、说明os.path.exists():用于判断某个路径(文件或文件夹)是否存在...
    99+
    2023-06-15
  • Node.js中的模块系统介绍
    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js ...
    99+
    2022-11-13
  • python os模块和fnmatch模块的使用介绍
    目录一、先介绍一下os模块1、拆分路径的方法介绍2、构建文件路径的方法介绍3、获取文件属性的方法介绍4、判断文件的类型5、文件和目录操作6、修改文件属性和判断文件属性7、遍历目录树二...
    99+
    2022-11-11
  • Python中python-nmap模块的使用介绍
    目录一、python-nmap的安装二、python-nmap模块的使用1.portScanner()类环境: python 2.7.13 Windows和Linux默认都...
    99+
    2022-11-13
  • node.js中http模块和url模块的简单介绍
    前言 本文主要给大家介绍了关于node.js中http模块与url模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、http模块的简单介绍 node.js当中的http内...
    99+
    2022-06-04
    模块 简单 js
  • python中string模块各属性以及函数的用法介绍
    任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作。 python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求: &...
    99+
    2022-06-04
    函数 模块 属性
  • Python中的socket网络模块介绍
    目录Socket服务端(server.py)客户端(client.py)socket中的一些常用方法Socket 对象(内建)方法Python Internet 模块前言: Pyth...
    99+
    2022-11-11
  • python中re模块的详细介绍
    本篇内容介绍了“python中re模块的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正则表达式的元字符有. ^ $ * { [ ...
    99+
    2023-06-04
  • Python中各个模块的介绍和使用
    北京 | 高性能计算之GPU CUDA课程11月24-26日3天密集学习 快速带你晋级阅读全文> 作者,许胜利,Python开发工程师,任职于上海某财富管理有限公司。 在Python中有一个概念叫做模块(module),这个和...
    99+
    2023-01-31
    模块 Python
  • Node.js模块化原理与应用详细介绍
    目录什么是模块化模块化规范node.js中的模块分类加载模块node.js的模块作用域什么是模块作用域模块作用域的好处向外共享模块作用域中的成员module对象module.expo...
    99+
    2022-11-13
  • node中http模块的使用及执行流程
    在node中http有什么作用 http这个模块的职责就是帮你创建编写服务器 执行流程  1. 加载http模块 const http = require('htt...
    99+
    2022-11-12
  • node中的fs模块、path模块怎么用
    本篇内容主要讲解“node中的fs模块、path模块怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node中的fs模块、path模块怎么用”吧!fs文件系...
    99+
    2022-10-19
  • python中sys模块的介绍与实例
    python版本: Python 2.7.6 1: sys是python自带模块. 利用 import 语句输入sys 模块。 当执行import sys后, python在 s...
    99+
    2022-11-12
  • node.js中debug模块的简单介绍与使用
    前言 相信使用node.js的朋友们都知道,一般在nodejs需要进行调试的时候,可以使用console.log()方法来将调试信息输出到控制台,当发布到生产环境的时候,需要将这些调试信息都注释掉,为了方便...
    99+
    2022-06-04
    模块 简单 node
  • Node.js模块化的使用详细介绍
    目录什么是模块化编程领域中的模块化模块化规范Node.js中的模块化加载模块Node.js中的模块作用域1. 什么是模块作用域2. 模块作用域的好处向外共享模块作用域中的成员1. m...
    99+
    2022-11-13
  • Node.js中的events事件模块怎么使用
    本篇内容主要讲解“Node.js中的events事件模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的events事件模块怎么使用”吧...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作