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

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

Node.js中的事件驱动模型基本上是所有I/O操作的基础。EventEmitter是Node.js的核心模块之一,它提供了事件处理的接口,可以用于自定义事件,或者处理Node.js内部提供的事件。

事件模块Events的基础使用

继承EventEmitter

我们可以用ES6的方式继承Node.js提供的EventEmitter类来创建自己的自定义事件。代码如下:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', () => {
  console.log('触发了一个事件!');
});

myEmitter.emit('event');

上述代码中,我们先定义了一个MyEmitter类,用以继承EventEmitter类。然后我们创建了自己的实例对象myEmitter,添加一个名为"event"的事件,并在该事件下绑定一个回调函数打印控制台。最后我们调用emit方法触发该事件。

EventEmmiter.on(eventName,listener)方法

on方法用于绑定事件处理函数,可以对一个事件绑定多个处理函数,所有的处理函数会按照添加的顺序依次执行。示例代码如下:

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('event', () => console.log('处理函数一'));
emitter.on('event', () => console.log('处理函数二'));

emitter.emit('event');

我们创建了一个事件event,并在该事件上绑定了两个处理函数。最后使用emit方法来触发事件,输出结果为:

处理函数一
处理函数二

事件模块Events的实际应用

现在我们来结合一些常见的场景来看下如何使用Events模块。

例子一: EventEmitter模拟用户登录登出时的事件

假设我们正在开发一个网站,需要记录用户的登录和登出时间。这时候我们可以使用EventEmitter来模拟一个用户登录登出的事件,代码如下:

const EventEmitter = require('events');
const emitter = new EventEmitter();

const userList = [
  { name: '张三', isLogin: false },
  { name: '李四', isLogin: false },
  { name: '王五', isLogin: false },
];

function login(name) {
  const user = userList.find(user => user.name === name);
  if (user) {
    if (!user.isLogin) {
      user.isLogin = true;
      emitter.emit('login', name + '已登录');
    } else {
      console.log(name + '已经登录');
    }
  } else {
    console.log('查无此人');
  }
}

function logout(name) {
  const user = userList.find(user => user.name === name);
  if (user) {
    if (user.isLogin) {
      user.isLogin = false;
      emitter.emit('logout', name + '已登出');
    } else {
      console.log(name + '未登录');
    }
  } else {
    console.log('查无此人');
  }
}

emitter.on('login', msg => console.log(msg));
emitter.on('logout', msg => console.log(msg));

login('张三');
login('张三');
logout('张三');
logout('李四');
logout('王五');

代码中,我们定义了一个userList数组对象来模拟用户列表数据,包含用户姓名和登录状态等信息。下面,我们定义两个函数login和logout用于登录登出操作。当用户登录成功时,通过emit方法触发login事件并输出一条信息。当用户登出成功时,通过emit方法触发logout事件并输出一条信息。最后,我们通过on方法监听login和logout事件,打印出事件的输出结果。

执行上面的代码,输出结果为:

张三已登录
张三已经登录
张三已登出
李四未登录
王五未登录

这样,我们就可以很方便地监控用户的登录状态,并做出相应的操作。

例子二: EventEmitter模拟文件传输进度的事件

这个例子演示了如何使用EventEmitter来模拟在文件传输中使用的进度条。代码如下:

const EventEmitter = require('events');
const emitter = new EventEmitter();

function uploadFile() {
  const file = { size: 1000, uploaded: 0 };
  const timer = setInterval(() => {
    if (file.uploaded >= file.size) {
      clearInterval(timer);
      emitter.emit('end', `上传完毕,共上传${file.size}kB`);
    } else {
      emitter.emit('progress', `已上传${file.uploaded}kB`);
      file.uploaded += 100;
    }
  }, 1000);
}

emitter.on('progress', msg => console.log(msg));
emitter.on('end', msg => console.log(msg));

uploadFile();

这段代码中,我们定义了一个文件对象file,包含文件大小和已上传的大小。接着我们使用一个定时器来模拟文件上传的进度,并通过emit方法监听progress和end事件。当文件上传结束后,我们通过emit方法触发end事件,告知用户文件上传已完成。

执行代码,会看到类似如下的输出:

已上传0kB
已上传100kB
已上传200kB
已上传300kB
已上传400kB
已上传500kB
已上传600kB
已上传700kB
已上传800kB
已上传900kB
上传完毕,共上传1000kB

这样,我们就可以很方便地实现一个文件上传的进度条了。

以上就是本次Node.js学习之事件模块Events的使用示例的完整攻略。在实际开发中,我们可以基于Events模块开发许多不同的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node.js学习之事件模块Events的使用示例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node中Stream流的详细介绍

    Node中Stream流的详细介绍 在Node.js中,Stream是一种数据处理方式,可以使得数据从一个地方流向另一个地方,Stream可以用于网络请求、文件操作、数据解压缩等等场景。 Stream的基本概念 Stream是一个基于事件的处理机制,它是一种可读、可写或可读写的数据流。Stream是分块处理的,意味着数据会分成小块并逐步传输而不是一次性传输所…

    node js 2023年6月8日
    00
  • Node.js巧妙实现Web应用代码热更新

    Node.js 巧妙实现 Web 应用代码热更新可以通过 nodemon 这个工具来实现,具体步骤如下: 1. 安装 nodemon nodemon 是一个基于 Node.js 开发的工具,能够自动监控 Node.js 应用的服务更改,并在更改后重启 Node.js 应用程序。因此,我们需要先在本地安装 nodemon。在命令行中输入以下命令: npm in…

    node js 2023年6月8日
    00
  • Node.js服务器环境下使用Mock.js拦截AJAX请求的教程

    以下是详细讲解“Node.js服务器环境下使用Mock.js拦截AJAX请求的教程”的完整攻略。 什么是Mock.js? Mock.js是一个生成随机数据的库,可以用于模拟数据接口以方便前端开发测试及数据 mock。Mock.js支持随机生成文本、数字、日期、布尔、数组、对象等数据类型,而且可以根据模板生成指定数据。Mock.js还提供了api,能够与 ax…

    node js 2023年6月8日
    00
  • JavaScript深拷贝方法structuredClone使用

    JavaScript中的拷贝(复制)有两种:浅拷贝和深拷贝。 浅拷贝只复制基本数据类型的值,而对于引用数据类型(如对象,数组等),只复制了其引用地址,因此它们指向同一个对象,当一个对象的值改变,另一个对象的值也会跟着改变。 而深拷贝则会复制出一个全新的对象,与被复制的对象互不影响。 这里介绍一种深拷贝方法,即使用“structuredClone”。 1. s…

    node js 2023年6月8日
    00
  • 树结构之JavaScript

    当我们需要在JavaScript中构建树形结构时,可以使用常见的方法如递归,或者使用专门用于构建树形结构的库,例如d3.js、jstree等库来构建。 在这里我们将讨论使用递归方式来构建树形结构的方法。 1.构建节点对象 首先我们需要构建一个节点对象,用来表示树中的一个节点。该节点应包含以下属性: value: 该节点的值 children: 该节点所属的子…

    node js 2023年6月8日
    00
  • nodejs中实现修改用户路由功能

    下面是详细的攻略: 准备 在开始实现前,需要先安装Node.js和Express框架。步骤如下: 安装 Node.js:从 Node.js 官网 下载并安装包。 创建项目文件夹。 打开终端,进入到项目文件夹目录下。 输入以下命令安装 Express 框架: npm install express –save 其中,–save参数用于将安装的依赖项保存到项…

    node js 2023年6月8日
    00
  • JS实现添加,替换,删除节点元素的方法

    要实现JS对节点元素的添加、替换、删除,可以使用DOM操作相关API。 添加节点元素 可以使用createElement()方法创建新的节点元素,并使用appendChild()方法将其添加到指定的父元素下。 // 创建新的节点元素 var newElement = document.createElement(‘p’); // 设置节点文本 newElem…

    node js 2023年6月8日
    00
  • JavaScript中实现键值对应的字典与哈希表结构的示例

    在JavaScript中可以实现键值对应的字典或哈希表结构,可以使用对象(Object)或Map来实现。下面分别介绍两种方式的实现方法。 使用对象实现字典和哈希表 JavaScript中的对象是一种拥有键值对应关系的数据类型,可以使用对象模拟字典和哈希表结构。下面是一个示例: // 创建字典 const dict = { ‘key1’: ‘value1’, …

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部