nodejs events
EventEmitter类
events模块提供一个对象:events.EventEmitter,核心是事件触发和事件监听的封装。
大多数时候不会直接使用EventEmitter,而是在对象中继承它(new一个出来)。
方法:
on:
为指定事件注册一个监听器,接收一个字符串event和一个回调函数。
emit:
触发事件。返回值为布尔值。
once:
为指定事件注册一个单次监听器,最多只会触发一次,触发后立刻解除该监听器。
addListener:
为指定事件添加一个监听器到监听器数组的尾部。
removeListener:
移出指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。接收两个参数,一个是事件名称,第二个是回调函数名称。
removeAllListeners:
移除所有事件的监听器,如果指定事件,则移除指定事件的所有监听器。
listeners:
返回指定事件的监听器数组。
示例:
//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); var listener1 = function listener1() {
console.log('监听器1执行');
}; var listener2 = function listener2() {
console.log('监听器2执行');
}; emitter.on('someEvent', listener1); emitter.on('someEvent', listener2); var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent'); console.log(eventListeners + '个监听器'); //2个监听器 emitter.emit('someEvent'); //移除第一个监听器listenter1
emitter.removeListener('someEvent', listener1); var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent'); console.log(eventListeners + '个监听器'); //1个监听器 console.log('程序执行完毕');
执行:
$ node test.js
2个监听器
监听器1执行
监听器2执行
1个监听器
程序执行完毕
setMaxListeners:
默认情况下,EventEmitters超过10个监听器就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量。
示例:
//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); emitter.on('someEvent', function () {
console.log('监听器1执行');
});
emitter.on('someEvent', function () {
console.log('监听器2执行');
});
emitter.on('someEvent', function () {
console.log('监听器3执行');
});
emitter.on('someEvent', function () {
console.log('监听器4执行');
});
emitter.on('someEvent', function () {
console.log('监听器5执行');
});
emitter.on('someEvent', function () {
console.log('监听器6执行');
});
emitter.on('someEvent', function () {
console.log('监听器7执行');
});
emitter.on('someEvent', function () {
console.log('监听器8执行');
});
emitter.on('someEvent', function () {
console.log('监听器9执行');
});
emitter.on('someEvent', function () {
console.log('监听器10执行');
});
emitter.on('someEvent', function () {
console.log('监听器11执行');
}); emitter.emit('someEvent');
命令行执行:
$ node test.js
监听器1执行
监听器2执行
监听器3执行
监听器4执行
监听器5执行
监听器6执行
监听器7执行
监听器8执行
监听器9执行
监听器10执行
监听器11执行
(node:10112) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 someEvent listeners added. Use emitter.setMaxListeners() to increase limit
当绑定的监听器超过10个时,虽然程序顺利执行,但是抛出了警告。如下所示,就不会发出警告了。要添加在监听器绑定的前面。
//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); emitter.setMaxListeners(11); //提高监听器的默认限制数量 emitter.on('someEvent', function () {
console.log('监听器1执行');
});
emitter.on('someEvent', function () {
console.log('监听器2执行');
});
emitter.on('someEvent', function () {
console.log('监听器3执行');
});
emitter.on('someEvent', function () {
console.log('监听器4执行');
});
emitter.on('someEvent', function () {
console.log('监听器5执行');
});
emitter.on('someEvent', function () {
console.log('监听器6执行');
});
emitter.on('someEvent', function () {
console.log('监听器7执行');
});
emitter.on('someEvent', function () {
console.log('监听器8执行');
});
emitter.on('someEvent', function () {
console.log('监听器9执行');
});
emitter.on('someEvent', function () {
console.log('监听器10执行');
});
emitter.on('someEvent', function () {
console.log('监听器11执行');
}); emitter.emit('someEvent');
监听事件的最大额度并不是为所有事件分配的,例如下面代码,不会发出监听器数量警告
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();
emitter.on('someEvent', function () {
console.log('监听器1执行');
});
emitter.on('someEvent', function () {
console.log('监听器2执行');
});
emitter.on('someEvent', function () {
console.log('监听器3执行');
});
emitter.on('someEvent', function () {
console.log('监听器4执行');
});
emitter.on('someEvent', function () {
console.log('监听器5执行');
});
emitter.on('someEvent', function () {
console.log('监听器6执行');
});
emitter.on('someEvent2', function () {
console.log('监听器7执行');
});
emitter.on('someEvent2', function () {
console.log('监听器8执行');
});
emitter.on('someEvent2', function () {
console.log('监听器9执行');
});
emitter.on('someEvent2', function () {
console.log('监听器10执行');
});
emitter.on('someEvent2', function () {
console.log('监听器11执行');
});
emitter.emit('someEvent');
emitter.emit('someEvent2');
nodejs events的更多相关文章
- nodejs events模块
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); console.log(emi ...
- Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动
1. Nodejs 的单线程 非阻塞 I/O 事件驱动在 Java. PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程.而每个线程需要耗费大约 2MB 内存.也就是说,理论 ...
- Nodejs入门级基础+实战
这篇随笔将会按序记录如下内容: NodeJs 简介 安装 NodeJs HTTP 模块.URL 模块 CommonJs 和 Nodejs 中自定义模块 NodeJs FS 模块 利用 HTTP 模块 ...
- 十九、Node.js-非阻塞IO、异步以及 '事件驱动EventEmitter'解决异步
1.Nodejs 的单线程 非阻塞 I/O 事件驱动 在 Java.PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程而每个线程需要耗费大约 2MB 内存.也就是说,理论上, ...
- nodejs报错 events.js:72 throw er; // Unhandled 'error' event
var http = require('http'); var handlerRequest = function(req,res){ res.end('hello');}; var webServe ...
- nodejs显现events.js:72抛出错误
随着人们开始学习,我用nodejs过程中遇到如下列错误执行: events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EAD ...
- nodeJS之事件events
前面的话 events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Nod ...
- 深入出不来nodejs源码-events模块
这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...
- nodejs出现events.js:72中抛出错误 Error: listen EADDRINUSE
<pre>events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoExce ...
随机推荐
- Ops: 高效组合命令集合
简介 本篇博客收集一些常用的复杂命令组合,这些命令组合能够高效的定位.分析.处理一些问题,希望对需要的小伙伴有所帮助. 命令集合 批量备份文件 将名称为config.xml的文件查找出来,并在原目录备 ...
- 文件共享服务之Samba
一.Samba服务概述 在Windows网络环境中.机之间进行文件打印和共享是通过微软自己的SMB/CIFS协议来实现的.SMB(服务消息块)和CIFS(通用互联网文件系统)这两个都是微软的私有协议 ...
- 并发编程之Master-Worker模式
我们知道,单个线程计算是串行的,只有等上一个任务结束之后,才能执行下一个任务,所以执行效率是比较低的. 那么,如果用多线程执行任务,就可以在单位时间内执行更多的任务,而Master-Worker就是多 ...
- javascript js获取html元素各种距离方法
//滚动条 scrollLeft//滚动条距左边距离 scrollTop//滚动条距顶部距离 scrollWidth//滚动条元素的宽 scrollHeight//滚动条元素的高 //可视范围 cli ...
- PHP+mysql数据库简单分页实例-sql分页
前几天冷月写了一篇博文<php基础编程-php连接mysql数据库-mysqli的简单使用>,很多小伙伴在学习后都知道了php与mysql数据库的连接,今天冷月分享一个简单的分页实例 首先 ...
- pytorch之 batch_train
import torch import torch.utils.data as Data torch.manual_seed(1) # reproducible BATCH_SIZE = 5 # BA ...
- 单页应用(SPA,Single-page-App)和多页应用(MPA,Multi-page App)的区别
单页应用(SPA,Single-page-App)和多页应用(MPA,Multi-page App)的区别 参考博客:https://www.jianshu.com/p/4c9c29967dd6
- Kail Linux下载与安装
官方镜像: https://www.kali.org/downloads/ 官方虚拟机镜像: https://www.offensive-security.com/kali-linux-vm-vmwa ...
- C#实现把String字符串转化为SQL语句中的In后接的参数
实现把String字符串转化为In后可用参数代码: public string StringToList(string aa) { string bb1 = "("; if (!s ...
- 小白的linux学习笔记10:安装nginx和第一个网页
sudo yum install nginx sudo systemctl status nginx sudo systemctl start nginx 检查端口:netstat -tlpn sud ...