Node.js之EventEmiter
参考:
Node.js主要API使用异步事件驱动模型,异步I/O操作完成时,或者某些类型对象(触发器)会周期性地,触发一个命名事件到事件队列,用来调用函数对象(监听器)。
比如net.Server对象在每次有新连接时触发一个事件,fs.readStream对象在文件打开时触发一个事件。
所有这些能产生事件的对象都是events.EventEmitter的实例。
所有这些对象开放接口:
1. 注册事件名&监听器
on()注册一个事件(名)和一个监听器,添加到监听器数组末尾,addListener()是on()的别名。emit(), 按顺序执行每个监听器。
eventEmitter.on() // 绑定事件名&监听器
demo source code:
var events = require('events');
var eventEmitter = new events.EventEmitter;
eventEmitter.on('start', function() {
console.log('eventEmitter starts');
});
eventEmitter.emit('start');
运行结果(打印):
eventEmitter starts
2. 给监听器listener传入参数与this
emit方法允许给监听器传入任意参数,并且标准this会被设置为监听器所附加的EventEmitter。
demo:
var events = require('events');
var eventEmitter = new events.EventEmitter;
eventEmitter.on('start', function(a,b) {
console.log('eventEmitter starts');
console.log(a,b,this);
});
eventEmitter.emit('start','a','b');
运行结果(打印):
eventEmitter starts
a b { domain: null,
_events: { start: [Function] },
_maxListeners: 10 }
3. 最多只触发一次的监听器
on注册的监听器可以触发多次,once注册的最多触发一次。
demo
var events = require('events');
var eventEmitter = new events.EventEmitter;
//用on注册事件,绑定监听器
eventEmitter.on('start', function() {
console.log('eventEmitter starts');
});
eventEmitter.emit('start');
eventEmitter.emit('start');
//用once注册事件,绑定监听器
eventEmitter.once('do', function() {
console.log('eventEmitter do');
});
eventEmitter.emit('do');
eventEmitter.emit('do');
运行结果输出:
eventEmitter starts
eventEmitter starts
eventEmitter do
4. 错误事件
EventEmitter实例发生错误时,会触发名为‘error’的特殊事件。
为防止node.js程序崩溃,建议始终为'error'事件注册监听器。
var events = require('events');
var eventEmitter = new events.EventEmitter;
//用on注册事件,绑定监听器
eventEmitter.on('error', function(err) {
console.log('eventEmitter err occurs');
});
eventEmitter.emit('error', new Error('programme exception'));
运行输出结果:
eventEmitter err occurs
5. 添加监听器/移除监听器事件
当新增监听器时,所有EventEmitter会触发'newListener'事件;当移除监听器时,会触发'removeListener'事件。
demo
var events = require('events');
var eventEmitter = new events.EventEmitter;
//用once注册事件,只会执行一次
eventEmitter.once('newListener', function(event, listener) {
if(event=='start') {
eventEmitter.on('start',function(){
console.log('start 2');
});
console.log('start');
}
});
eventEmitter.on('start',function(){
console.log('eventEmitter start');
});
eventEmitter.emit('start');
运行输出:
start
start 2
eventEmitter start
可以看到,触发‘start’事件,会同时触发'newListener'事件,并且on注册事件不会等待,而是直接执行后面的语句。
| newListener&removeListener事件触发源 | ||
| 事件名 | 触发源 | 备注 |
| newListener | addListener() | on()别名 |
| on() | ||
| once() | 只执行一次便自行注销 | |
| removeListener | removeListener() | |
| removeAllListeners() | ||
| off() |
removeListener()别名,v10.0.0添加 |
|
6. 最大监听器数量
获取最大监听器数量getMaxListeners(),v1.0.0 API才有用,老版本nodejs可能会有编译错误。超出最大数量限制时,可以调用setMaxListeners()重新设置更大值。
Node.js之EventEmiter的更多相关文章
- Node.js小白开路(一)-- events篇
时间或许可以说是以JS来理解世界的基础,针对于某一个情况对象会做出何种反应,反应之后会做出何种处理,以及这一事件衍生出来了哪一些变化. 大多数 Node.js 核心 API 都采用惯用的异步事件驱动架 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- Node.js:理解stream
Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
- Node.js入门(一)
一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...
随机推荐
- SPRING MICROSERVICES IN ACTION
What is microservice 背景 在微服务的概念成型之前,绝大部分基于WEB的应用都是使用单体的风格来进行构建的.在单体架构中,应用程序作为单个可部署的软件制品交付,所有的UI(用户接口 ...
- vs2019 opencv4的相关配置
opencv4.11存在改动,导致许多demo没有办法正常运行,但是配置方法却是相同的. 主要是连接器输入,头文件包含路径,库路.如果想要调试,还需要设置调试文件符号表. [未完待续]
- Scrapy模拟登陆
1. 为什么需要模拟登陆? #获取cookie,能够爬取登陆后的页面 2. 回顾: requests是如何模拟登陆的? #1.直接携带cookies请求页面 #2.找接口发送post请求存储cooki ...
- 巨头环伺下,青云QingCloud的云计算之路危机重重
编辑 | 于斌 出品 | 于见(mpyujian) 随着互联网.科技行业的深入发展,国内云计算市场正越来越爆发出惊人的潜力,大量大.中.小型玩家开始不断发力,涌现出了一大批增速明显的行业玩家. 以BA ...
- redis介绍、单机安装以及java调用
什么是redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求(非关系型的.分布式的.开源的.水平可扩展 ...
- TakeColor下载及调节鼠标指针不一致的问题
取色器下载链接: 链接:https://pan.baidu.com/s/19TBWZA2ltaLQjzskTipnmg 提取码:2uz3 若出现指针与鼠标不一致: TakeColor v8.0 > ...
- go开发工具goclipse的安装
(1) 安装Eclipse 建议下载Eclipse时直接下载"Eclipse IDE for Java Developers"的package,而不要下载较小的Installer. ...
- centos 时区的更改 UTC TO CST
在CentOS Linux中终端命令中执行以下命令: 1).vi /etc/sysconfig/clock #编辑时间配置文件 ZONE="Asia/Shanghai" UTC ...
- A Kill Cord for your Laptop
前言 昨晚在朋友圈看到国外一篇文章利用U盘锁笔记本电脑,刚好有一个坏的金士顿U盘,所以就折腾了一下. 准备 USB设备*1 Arch系统*1 走过的坑 因为systemd-udevd带起来的进程是ro ...
- MDC 输出线程信息帮助定位问题
log4j中的%x ---NDC,%X---MDC 即%x NDC.clear();NDC.push(this.toString());%X{first} %X{last}MDC.put(" ...