Node.js 事件触发器详细总结

Api目录

  1、简单的注册、触发事件的流程

  2、eventEmitter.defaultMaxListeners

  3、emitter.setMaxListeners(n)

  4、emitter.getMaxListeners(n)

  5、emitter.prependListener(eventName, listener);

  6、emitter.prependOnceListener(eventName, listener)

  7、emitter.removeListener(eventName, listener)

  8、emitter.removeAllListeners(eventName)

  9、emitter.off(eventName, listener)

  10、emitter.eventNames()

  11、emitter.on(‘eventName‘, listener)

  12、emitter.once(‘eventName‘, listener)

  13、emitter.emit(‘eventName‘, params)

一、什么是事件模块(events)

1、大多数Node.js核心Api都是采用惯用的异步事件驱动架构

2、所有能触发事件的对象都是EventEmitter类的实例

3、事件流程:引入模块 -> 实例化EventEmitter类 -> 注册事件 -> 触发事件

二、举例说明Api

1、简单的注册、触发事件的流程

// 引入事件模块
const eventEmitter= require(‘event‘).EventEmitter;

// 实例化EventEmitter类
let emitter = new eventEmitter();

// 注册事件
emitter.on(‘someEvent‘, function(){
    console.log(‘触发事件‘)
})

// 触发事件
emitter.emit(‘someEvent‘)
// 打印:触发事件

注:node.js官方文档中,api的EventEmitter 和 emitter 在此所指:

a、所有 EventEmitter 对象指的就是 eventEmitter 对象

b、所有 emitter 实例,指的就是上面实例化的 emitter 对象

2、eventEmitter.defaultMaxListeners

EventEmitter下所有实例的可注册监听器个数的默认值. 默认是10个.(注:是改变EventEmitter下所有实例的);

console.log(eventEmitter.defaultMaxListeners);

//打印:10

3、emitter.setMaxListeners(n)

改变指定的单个 EventEmitter 实例的最大注册数量; 值设为 Infinity(或 0)表示不限制监听器的数量。

4、emitter.getMaxListeners(n)

获取单个实例最大监听器数量

// 设置单个实例最大监听器数量
emitter.setMaxListeners(15);

// 获取单个实例最大监听器数量
let getMaxListeners = emitter.getMaxListeners();

console.log(getMaxListeners);
// 打印:15

5、emitter.prependListener(eventName, listener);

eventName: 已经注册的监听器名称

listener: Function 回调

用来指定多个相同eventName的监听器中,首先调用哪个listener回调.(原理是将指定监听器,添加到监听器数组的开头,本质还是顺序执行)

// test1 listener监听方法
function test1 () { console.log(‘a‘) }

// test2 listener监听方法
function test2 () { console.log(‘b‘) }

// 绑定foo事件
emitter.on(‘foo‘, test1);

// 将test2监听器方法放在监听器数组的头部,首先执行
emitter.prependListener(‘foo‘, test2);

emitter.emit(‘foo‘)
// 打印:‘b‘ ‘a‘

6、emitter.prependOnceListener(eventName, listener)

eventName: 已经注册的监听器名称

listener: Function 回调

添加一个只能执行一次的eventName事件监听器,下次再触发时,当前监听器会被先移除,然后在调用.

添加单次监听器 listener 到名为 eventName 的事件的监听器数组的开头 ( 当 eventName 事件第二次触发时,监听器会先被移除,然后再调用。)

7、emitter.removeListener(eventName, listener)

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

// removeListener:删除监听器触发
emitter.on("removeListener", function (event, listener) {
   console.log("移除了-" + event + "事件的" + listener "监听器")
});

// 绑定test事件,并将tests作为test事件的listener
emitter.on("test", tests);
function tests(){
    console.log("测试事件")
};

// 触发test事件
emitter.emit("test");

// 删除test的事件监听数组中的tests监听器
emitter.removeListener("test", tests);

// 打印:
// 测试事件
// 移除了 test 事件的 tests 监听器

8、emitter.removeAllListeners(eventName)

移除全部监听器或指定的 eventName 事件的所有监听器。

// test1事件 只有一个监听器
emitter.on("test1", function (data) {
    console.log(data)
});

// test2事件 只有一个监听器
emitter.on("test2", function (data) {
    console.log(data)
});

// test3 事件有两个监听器 分别是 test3s 和 test3ss
emitter.on("test3", test3s);
emitter.on("test3", test3ss);
function test3s(data) {
    console.log(data)
}
function test3ss(data) {
    console.log(data)
}

// 移除监听器触发
emitter.on("removeListener", function (event, listener) {
    console.log("移除了-" + listener + "事件")
});

emitter.emit("test1", ‘1‘); // 1
emitter.emit("test2", ‘2‘); // 2
emitter.emit("test3", ‘3‘); // 3 3

//移除test3下面所有的监听器
emitter.removeAllListeners(‘test3‘); // 第一次:移除了test3s 第二次:移除了test3ss
emitter.emit("test1", ‘4‘); // 4
emitter.emit("test2", ‘5‘); // 5
emitter.emit("test3", ‘6‘); // 无结果因为test3事件的监听器全部移除了

9、emitter.off(eventName, listener)

removeListener的别名

10、emitter.eventNames()

返回emitter实例下已注册的事件名数组。 数组中的值为字符串;

emitter.once(‘loadOnce‘, function () {
    console.log();
});

emitter.on(‘load‘, function () {
    console.log();
});

emitter.emit(‘load‘);
console.log(emitter.eventNames());
// 打印:[ ‘loadOnce‘, ‘load‘ ]

emitter.emit(‘loadOnce‘);
console.log(emitter.eventNames());
// 打印:[‘load‘ ]
// 原因: 因为once绑定的事件,执行一次之后就会移除。

11、emitter.on(‘eventName‘, listener)

eventName:事件名称

listener:回调函数

注册名称为eventName、回调函数为listener的事件

12、emitter.once(‘eventName‘, listener)

注册一次性名称为eventName,回调函数为listener的事件

注意:只触发一次,就会将其移除。

13、emitter.emit(‘eventName‘, params)

params:any 任意类型

触发名称为eventName的事件,按监听器数组顺序执行所有回调函数。

注意:以上nodejs事件的api,都是作者辛苦练习总结出来的,转载需注明转载地址,谢谢配合!

4、emitter.getMaxListeners(n)

原文地址:https://www.cnblogs.com/wangweizhang/p/10901605.html

时间: 2024-11-06 20:44:53

Node.js 事件触发器详细总结的相关文章

node.js零基础详细教程(4):node.js事件机制、node异步IO操作

第四章 建议学习时间3小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. node.js事件机制 node.js是单线程,但是通过事件和回调支持并发,可以实现非常高的性能. node.js所有的API都是通过异步调用.第一堂课的时候,我们写过一个同步和异步的示例(如下),当初说到:同步代码先执行完成,然后才执行异步

Node.js 事件

Node.js 事件 Node.js 所有的异步I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件. 所有这些产生事件的对象都是 events.EventEmitter 的实例. 你可以通过require("events");来访问该模块. 下面我们用一个简单的例子说明 EventEmitter 的用法: //even

node.js 事件发射器模式

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会

node.js事件循环 event loop

Nodejs事件循环 (event loop) node.js 事件循环的概念 当node.js 启动的时候会初始化eventloop ,每一个evnet loop 都会包含如下6个循环阶段,node.js 事件循环和浏览器事件循环完全不一样. 官网文档:https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/ timers pending callbacks (I/O callbakcs) idle, prepar

node.js零基础详细教程(5):express 、 路由

第五章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. express Express 是一个基于 Node.js 平台的极简.灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用. 其实可以简单的将express理解为node.js的一个类库:我们在使用j

【译】理解node.js事件轮询

Node.js的第一个基本论点是I/O开销很大. 当前编程技术中等待I/O完成会浪费大量的时间.有几种方法可以处理这种性能上的影响: 同步:每次处理一个请求,依次处理.优点:简单:缺点:任何一个请求都可以阻塞所有其他的请求. Fork一个新进程:开一个新进程来处理每个请求.优点:容易:缺点:不能很好的扩展,成百上千个连接意味着成百上千个进程.fork()函数相当于Unix程序员的锤子,因为它很有用,每个问题看起来就像一个钉子,通常会被过度使用.(译者注:直译比较拗口,我理解的意思是,Unix程序

node.js零基础详细教程(7):node.js操作mongodb,及操作方法的封装

第七章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. node.js操作mangodb 创建一个用于放置今天文件的文件夹,npm init初始化一下,并创建demo1.js用于写node代码 使用 npm install mongodb,将mongodb控制模块安装到本地 在demo1.js中写

Node.js 事件循环

原文:https://github.com/nodejs/node/blob/master/doc/topics/event-loop-timers-and-nexttick.md 什么是事件循环(Event Loop) 事件循环能让 Node.js 执行非阻塞 I/O 操作 -- 尽管JavaScript事实上是单线程的 -- 通过在可能的情况下把操作交给操作系统内核来实现. 由于大多数现代系统内核是多线程的,内核可以处理后台执行的多个操作.当其中一个操作完成的时候,内核告诉 Node.js,

node.js零基础详细教程(6):mongodb数据库操作

第六章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑.编写接口,最后完成一个完整的项目后台,预计共10天课程. 数据库 数据库管理结构,一般分为两种:B/S架构   C/S架构. B/S架构:  Browser/Server,浏览器/服务器模式,即通过浏览器和服务器端的数据库进行交互 C/S架构:  Client/Server,客户端/服务器模式,即通