Node.js中的events事件模块知识点总结

通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。

1. 什么是事件驱动?

事件驱动,简单来说就是通过有效方法来监听事件状态的变化,并在发生变化时做出相应的动作。

举一个生活应用的场景来理解:当我们去饭店吃饭点餐,当我们下单之后,服务员告诉我们的订单号(这时候可以理解为注册了一个事件),我们在坐着等候,这时候我们的耳朵就一直监听着服务员的喊号,当喊到我们的时候,我们可以去前台取餐。

2. 事件模型

NodeJS的事件架构采用经典的--订阅发布模式

订阅发布模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N(多个或者单个)观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者注册的相应事件,该设计模式解决了主体对象与观察者之间功能的耦合。

3. events模块

events模块是NodeJS非常重要的一个模块,在node中大部分的模块的实现都继承了Events类,如fs,http,net等。它提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。

简单使用:

import { EventEmitter } from 'events';

class MyEmiter extends EventEmitter{};

const myEmitter = new MyEmiter();

myEmitter.on('hello', () => {
  console.log('hello 有人喊你啦');
});

myEmitter.emit('hello');

4. Events模块核心API

4.1 eventEmitter.on(eventName, callback)

注册监听事件

参数:

eventName: 事件名称

callback: 事件触发被调用回调函数

4.2 eventEmitter.once(eventName, callback)

可以注册一个监听器,该监听器最多为特定事件调用一次。 一旦事件被触发,则监听器就会被注销然后被调用。

参数:

eventName: 事件名称

callback: 事件触发被调用回调函数

4.3 eventEmitter.emit(eventName[, ...args])

触发指定的监听事件

参数:

eventName: 事件名称

args可选参数,按顺序传入回调函数的参数;

4.4 eventEmitter.removeListener(eventName, callback)

移除指定事件的监听器,注意:该监听器必须是注册过的。否则无效。

参数:

eventName: 事件名称

callback: 回调函数

4.5 EventEmitter.removeAllListeners(eventName)

移除所有监听器,一个事件可以有多个监听,需要全部移除时,可以用此方法。

参数:

eventName: 需要全部移除的事件名称;

需要特别注意的是,如果不传参数,将会移除所有的监听事件,比较暴力,建议慎用。

4.6 EventEmitter.listeners(eventName)

返回名为 eventName 的事件的监听器绑定回调函数数组的副本。

4.7 EventEmitter.eventNames()

返回列出触发器已为其注册监听器的事件的数组。

4.8 EventEmitter.setMaxListeners(n)

默认情况下,如果为特定事件添加了 10 个以上的监听器,则 EventEmitter 将打印警告。

emitter.setMaxListeners() 方法允许修改此特定 EventEmitter 实例的限制。 该值可以设置为 Infinity(或 0)以指示无限数量的监听器。

5. 同步异步的问题

EventEmitter 按照注册的顺序同步地调用所有监听器。这确保了事件的正确排序,并有助于避免竞争条件和逻辑错误。

6.错误处理

当 EventEmitter 实例中发生错误时,典型的操作是触发 'error' 事件。 这些在 Node.js 中被视为特殊情况。

如果 EventEmitter 没有为 'error' 事件注册至少一个监听器,并且触发 'error' 事件,则会抛出错误,打印堆栈跟踪,然后退出 Node.js 进程。

作为最佳实践,应始终为 'error' 事件添加监听器。

import { EventEmitter } from 'events';

class MyEmiter extends EventEmitter{};

const myEmitter = new MyEmiter();

myEmitter.on('hello', () => {
  console.log('hello 有人喊你啦');
});

myEmitter.on('error', (e) => {
  console.log(e)
})

myEmitter.emit('hello');
myEmitter.emit('error', new Error('an error happen'))

到此这篇关于Node.js中的events事件模块知识点总结的文章就介绍到这了,更多相关Node.js中的events事件模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • node.JS事件机制与events事件模块的使用方法详解

    node.JS事件机制说明 多数 Node.js 核心 API 都是采用惯用的异步事件驱动架构,其中某些类型的对象(称为触发器)会周期性地触发命名事件来调用函数对象(监听器).例如,一个net.Server对象会在每次有新连接时触发一个事件:一个 fs.ReadStream 会在文件被打开时触发一个事件:一个 stream会在数据可读时触发事件. EventEmitter EventEmitter 类由 events 模块定义和开放的,所有能触发事件的对象都是 EventEmitter 类的实例

  • node.js中事件触发器events的使用方法实例分析

    本文实例讲述了node.js中事件触发器events的使用方法.分享给大家供大家参考,具体如下: node.js是基于事件驱动的,通过events,我们可以方便的创建事件,并通过触发事件来调用我们自定义的监听函数. 所有能触发事件的对象都应该是 EventEmitter 类的实例,一般我们自定义一个类继承于 EventEmitter 类. 通过on()方法我们可以绑定事件与监听函数: const Events = require('events'); //自定义一个类,继承于EventEmitt

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

    前言 本文主要给大家介绍了关于node.js事件模块Events使用的一些示例,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 环境:Node v8.2.1; Npm v5.3.0; OS Windows10 1. Node事件介绍 Node大多数核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器). 所有能触发事件的对象都是 EventEmitter 类的实例. 这些对象开放了一个 eventEmitter.o

  • 关于Node.js的events.EventEmitter用法介绍

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件. 所有这些产生事件的对象都是 events.EventEmitter 的实例. EventEmitter 类 events 模块只提供了一个对象: events.EventEmitter.EventEmitter 的核心就是事件触发与事件监听器功能的

  • Node.js中的events事件模块知识点总结

    通过对Node的学习及应用,我们知道NodeJS其采用单线程.事件驱动.非阻塞I/O等架构设计,非常适用于高并发.I/O密集型应用. 1. 什么是事件驱动? 事件驱动,简单来说就是通过有效方法来监听事件状态的变化,并在发生变化时做出相应的动作. 举一个生活应用的场景来理解:当我们去饭店吃饭点餐,当我们下单之后,服务员告诉我们的订单号(这时候可以理解为注册了一个事件),我们在坐着等候,这时候我们的耳朵就一直监听着服务员的喊号,当喊到我们的时候,我们可以去前台取餐. 2. 事件模型 NodeJS的事

  • 在 Node.js 中使用原生 ES 模块方法解析

    从版本 8.5.0 开始,Node.js 开始支持原生 ES 模块,可以通过命令行选项打开该功能.新功能很大程度上得归功于 Bradley Farias. 1.演示 这个示例的代码目录结构如下: esm-demo/ lib.mjs main.mjs lib.mjs: export function add(x, y) { return x + y; } main.mjs: import {add} from './lib.mjs'; console.log('Result: '+add(2, 3

  • 总结Node.js中9种fs模块文件操作方法(文件夹递归删除知识)

    目录 一.前言 二.fs.mkdir()创建文件夹 2.1 最简单的案例 2.2 递归创建文件夹 三.fs.wirteFile()创建.写文件 3.1 创建并写入一个文件 3.2 重写文件并指定编码 3.3 写入GBK格式的文件 四.fs.appendFile()文件后追加内容 4.1 使用追加的方式创建并写入内容 4.2 追加内容 五.fs.stat()判断路径是目录还是文件 5.1 判断文件案例 六.fs.readFile()读取文件内容 6.1 以默认格式读取文件 6.2 以指定格式(这里

  • node.js中的events.emitter.removeAllListeners方法使用说明

    方法说明: 移除所有监听器,如果指定event,则将移除指定事件的所有监听器. 语法: 复制代码 代码如下: emitter.removeAllListeners([event]) 接收参数: event         事件类型,支持多个 例子: 复制代码 代码如下: //移除所有监听器   emitter.removeAllListeners()   //移除指定event的所有监听器   emitter.removeAllListeners('data') 源码: 复制代码 代码如下: E

  • node.js中的events.EventEmitter.listenerCount方法使用说明

    方法说明: 返回注册了指定事件的监听器数量. 语法: 复制代码 代码如下: EventEmitter.listenerCount(emitter, event) 接收参数: emitter             事件发射器 event                事件 例子: 复制代码 代码如下: if(events.EventEmitter.listenerCount(this, 'feedback') == 0) {     //.... } 源码: 复制代码 代码如下: EventEm

  • node.js中的events.emitter.removeListener方法使用说明

    方法说明: 移除指定事件的某个监听器. 语法: 复制代码 代码如下: emitter.removeListener(event, listener) 接收参数: event            (string)             事件类型 listener         (function)        已注册过的监听器 例子: 复制代码 代码如下: var callback = function(stream) {   console.log('someone connected!

  • node.js中的events.emitter.listeners方法使用说明

    方法说明: 注册了指定event的所有监听器将被作为数组返回. 语法: 复制代码 代码如下: emitter.listeners(event) 接收参数: event    指定事件 例子: 复制代码 代码如下: server.on('connection', function (stream) {   console.log('someone connected!'); }); console.log(util.inspect(server.listeners('connection')));

  • node.js中的events.emitter.once方法使用说明

    方法说明: 为指定事件注册一个 单次 监听器,所以监听器至多只会触发一次,触发后立即解除该监听器. 语法: 复制代码 代码如下: emitter.once(event, listener) 接收参数: event            (string)             事件类型 listener         (function)         触发事件时的回调函数 例子: 复制代码 代码如下: server.once('connection', function (stream)

  • Node.js中路径处理模块path详解

    前言 在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了.下面我们就来详细介绍下关于Node.js中的路径处理模块path. 获取路径/文件名/扩展名 获取路径:path.dirname(filepath) 获取文件名:path.basename(filepath) 获取扩展名:path.extname(filepath) 获取所在路径 例子如下: var path = re

  • Node.js中DNS模块学习总结

    1. DNS 在Node.js中,提供DNS模块,以实现域名查找及域名解析的处理. 在DNS模块中,提供了三个主方法及一系列便捷方法. resolve方法:用于将一个域名解析为一组DNS记录. reverse方法: 用于将IP地址转换为一组域名. lookup方法: 用于将一个域名转换成IP地址. DNS模块中的其余便捷方法均为resolve方法的一种便捷形式. 2. 使用resolve方法将域名解析为DNS记录 `DNS.resolve(domain, [rrtype], callback(e

随机推荐