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 ...
随机推荐
- [蓝桥杯2017初赛]青蛙跳杯子 BFS
题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...
- 对象的上转型和下转型 (instanceof关键字)
1.对象的上转型,就是多态的一种写法 格式:父类名称 对象名 = new 子类名称(): Animal animal = new Cat(); 含义:右侧创建一个子类对象,把它当作父类来使用 向上转型 ...
- 从0到1了解 CI/CD
现代软件开发的需求加上部署到不同基础设施的复杂性使得创建应用程序成为一个繁琐的过程.当应用程序出现规模性增长,开发团队人员变得更分散时,快速且不断地生产和发布软件的流程将会变得更加困难.为了解决这些问 ...
- 11: Django + gunicorn + Nginx 的生产环境部署
1.1 gunicorn介绍 1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...
- 分布式一致性协议 --- Paxos
问题 Paxos 到底解决什么样的问题,动机是什么 Paxos 流程是怎么样的? Paxos 算法的缺陷是什么 概述 Paxos 是分布式一致性算法,根据少数服从多数的原则多个节点确定某个数值.通过学 ...
- JS-原生的ajax
记录一下: //post需要设置请求头 setRequestHeader(name, value)name //头部的名称:这个参数不应该包括空白.冒号或换行 //value 头部的值:这个参数不应该 ...
- Windows 搭建WAMP+Mantis
下载WAMP http://www.wampserver.com/ 安装直接下一步就行 安装完启动后,显示下面的logo 在浏览器输入 127.0.0.1/phpmyadmin 设置数据库(默认 ...
- 1143. Longest Common Subsequence
link to problem Description: Given two strings text1 and text2, return the length of their longest c ...
- Linux系统常用运维命令汇总
因为这段时间加入Java后台开发,所以对Java后台开发必会的Linux系统指令进行了熟悉这里进行汇总; tar 参数说明:-x: 解压 -z:有gzip属性 -v:显示所有过程 -f:文件名 -c: ...
- iOS中的主要框架framework
在日常的iOS项目开发中,主要使用的就是Foundation和UIKit这两个框架. (一)Foundation框架 Foundation是对Core Foundation框架的一个封装,使用Foun ...