首页 > 编程语言 >nodeJS中的事件机制

nodeJS中的事件机制

时间:2024-08-27 11:40:26浏览次数:5  
标签:console nodeJS EventEmitter var 事件 监听器 test 机制 emitter

events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http、fs等。本文将详细介绍nodeJS中的事件机制

EventEmitter

多数 Node.js 核心 API 都是采用惯用的异步事件驱动架构,其中某些类型的对象(称为触发器)会周期性地触发命名事件来调用函数对象(监听器)。例如,一个net.Server对象会在每次有新连接时触发一个事件;一个fs.ReadStream 会在文件被打开时触发一个事件;一个stream会在数据可读时触发事件。

【EventEmitter】
EventEmitter 类由 events 模块定义和开放的,所有能触发事件的对象都是 EventEmitter 类的实例

var EventEmitter = require('events');
/*
{ [Function: EventEmitter]
  EventEmitter: [Circular],
  usingDomains: false,
  defaultMaxListeners: [Getter/Setter],
  init: [Function],
  listenerCount: [Function] }
 */
console.log(EventEmitter);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

events模块的EventEmitter属性指向该模块本身

var events = require('events');
console.log(events.EventEmitter === events);//true
 
  • 1
  • 2

EventEmitter是一个构造函数,可以用来生成事件发生器的实例emitter

var EventEmitter = require('events');
var emitter = new EventEmitter();
/*
EventEmitter {
 domain: null,
 _events: {},
 _eventsCount: 0,
 _maxListeners: undefined }
*/
console.log(emitter);
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

方法

【emitter.emit(eventName[, …args])】

eventName <any>
...args <any>
 
  • 1
  • 2

该方法按监听器的注册顺序,同步地调用每个注册到名为eventName事件的监听器,并传入提供的参数。如果事件有监听器,则返回true,否则返回false

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//true
console.log(emitter.emit('test2'));//false
 
  • 1
  • 2
  • 3
  • 4
  • 5

【emitter.on(eventName, listener)】

该方法用于添加listener函数到名为eventName的事件的监听器数组的末尾

eventName <any> 事件名
listener <Function> 回调函数
 
  • 1
  • 2

注意:不会检查listener是否已被添加。多次调用并传入相同的eventName和listener会导致listener被添加与调用多次

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
});
emitter.on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

该方法返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

【emitter.addListener(eventName, listener)】

emitter.on(eventName, listener) 的别名

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

【emitter.prependListener()】

与on()方法不同,prependListener()方法可用于将事件监听器添加到监听器数组的开头

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

【emitter.once(eventName, listener)】

该方法添加一个单次 listener 函数到名为 eventName 的事件。 下次触发 eventName 事件时,监听器会被移除,然后调用

eventName <any> 事件名
listener <Function> 回调函数
 
  • 1
  • 2
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).once('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
emitter.emit('test');//1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

【emitter.prependOnceListener() 】

该方法用于将事件监听器添加到监听器数组开头。下次触发eventName事件时,监听器会被移除,然后调用

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependOnceListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
emitter.emit('test');//1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

【emitter.removeAllListeners([eventName])】

eventName <any>
 
  • 1

移除全部或指定 eventName 的监听器,返回一个 EventEmitter 引用,可以链式调用

注意:在代码中移除其他地方添加的监听器是一个不好的做法,尤其是当 EventEmitter 实例是其他组件或模块(如 socket 或文件流)创建的

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).removeAllListeners('test');
emitter.emit('test');//''
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

【emitter.removeListener(eventName, listener)】

eventName <any>
listener <Function>
 
  • 1
  • 2

从名为 eventName 的事件的监听器数组中移除指定的 listener

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意:removeListener最多只会从监听器数组里移除一个监听器实例。如果任何单一的监听器被多次添加到指定eventName的监听器数组中,则必须多次调用removeListener才能移除每个实例

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).on('test',show).removeListener('test',show);
emitter.emit('test');//'1'
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意:一旦一个事件被触发,所有绑定到它的监听器都会按顺序依次触发。这意味着,在事件触发后、最后一个监听器完成执行前,任何 removeListener() 或 removeAllListeners() 调用都不会从 emit() 中移除它们。 随后的事件会像预期的那样发生

因为监听器是使用内部数组进行管理的,所以调用它会改变在监听器被移除后注册的任何监听器的位置索引。 虽然这不会影响监听器的调用顺序,但意味着由 emitter.listeners() 方法返回的监听器数组副本需要被重新创建

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show1(){
    console.log(1);
    emitter.removeListener('test',show2);
}
function show2(){
    console.log(2);
}
emitter.on('test',show1).on('test',show2);
emitter.emit('test');//1 2
emitter.emit('test');//1
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
 

标签:console,nodeJS,EventEmitter,var,事件,监听器,test,机制,emitter
From: https://www.cnblogs.com/sexintercourse/p/18382353

相关文章

  • NodeJS云观影应用系统演示录像-计算机毕业设计源码60580
    摘 要随着互联网与移动互联网迅速普及,网络上的电影娱乐信息数量相当庞大,人们对获取感兴趣的电影娱乐信息的需求越来越大,个性化的基于Vue框架实现云观影应用系统成为一个热门。然而电影信息的表示相当复杂,因此需要开发一个基于Vue框架实现云观影应用系统设计与实现的电影信......
  • nodejs的事件机制
    nodejs的事件机制Node.js的事件机制是通过内置的 EventEmitter 类来实现的。这个类定义在 events 模块中,可以被用来创建可发送事件的类。以下是一个简单的例子,展示了如何使用 EventEmitter 来创建一个发送事件的对象,并为其添加事件监听器:  constEventEm......
  • JavaScript 的事件循环、宏任务、微任务
    JavaScrtipt执行顺序首先,必须要明确,在JavaScript中,所有任务都在主线程上执行。任务执行过程分为同步任务和异步任务两个阶段。异步任务的处理经历两个主要阶段:EventTable(事件表)和EventQueue(事件队列)。EventTable存储了宏任务的相关信息,包括事件监听和相应的回调函数。当特定......
  • Kafka的生产者和消费者机制
    目录1.基础的客户端1.1消息发送者的主流程1.2消息消费者主流程2.客户端工作机制2.1消费者分组消费机制2.2生产者拦截器机制2.3消息序列化机制2.4消息分区路由机制2.5生产者消息缓存机制2.6发送应答机制2.7生产者消息幂等性(1)生产者消息幂等性介绍(2)解决方案2.8......
  • 基于nodejs+vue办公系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂性的增加,传统的办公模式已难以满足高效、便捷的管理需求。在现代企业中,办公系统的智能化与集成化成为提升工作效率、优化......
  • 基于nodejs+vue办公物资管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,办公物资管理成为企业日常运营中不可或缺的一环。传统的手工记录与人工管理方式已难以满足现代企业对效率、准确......
  • 基于nodejs+vue办公室资产登记系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着现代企业规模的扩大与管理的精细化,办公室资产管理成为了一项日益复杂且重要的任务。传统的手工记录或简单的电子表格管理方式已难以满足高效、准确、实......
  • Android广播机制简介
    Android广播机制简介记得在我上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就会播放一条广播来告知全校的师生。类似的工作机制其实在计算机领域也有很广泛的应用,如果你了解网络通信原理应该会知道,在一个IP网络范围中,......
  • WPF 路由事件
    一、什么是路由事件?根据MSDN定义:功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。实现定义:路由事件是由类的实例支持的CLR事件,RoutedEvent由事件WindowsPresentationFoundation(WPF)系统处理。典型的WPF应......
  • Ubuntu glfw轮询获取按键事件
    这种方法的使用方式如下:while(!glfwWindowShouldClose(window)){processInputs(window);...}processInputs中包含的要素和上面介绍的回调函数差不多,只是用到了另一个GLFW的函数glfwGetKey。最终效果上,这个函数返回任意时间某个键的状态,就是这......