node的events模块
events可以说是node实现异步的基石,也是其他几个常用核心模块api的异步方法的原型。
var eventEmitter=require('events').EventEmitter;
//var eventEmitter=require('events'); 这样写也可以
var myEvent=new eventEmitter();
myEvent.on('shout',function(){console.log('Oh')})
myEvent.emit('shout');
引入events模块后,用它生成一个事件实例,就可以使用该实例的on方法监听(绑定)事件,emit方法触发事件,emit方法返回一个布尔值表示该事件是否已被监听。
EventEmitter.addListener()和on()方法类似,用以添加事件;
EventEmitter.removeListener(),用以移除事件;
1.可以给一个事件绑定多个回调,触发时回调按注册顺序依次执行;但不建议绑定太多(实话,现实情况也完全很少遇到一个时间绑定超过3个callback),怕造成内存泄漏。绑定的回调超过十个node会警告,可以通过.setMaxListener(int)改动允许的最大绑定数。
2.在事件的callback中,this指向myEvent本身;如果callback用的是箭头函数,则不指向myEvent,可能是个空对象{}。
3.在callback中,可以使用setImmediate() 或 process.nextTick() 方法延迟代码的执行以达到异步的效果...嗯。。就像在客户端用定时器一样;不过这种做法在具体生产中。。看情况吧。。
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('this happens asynchronously');
});
});
myEmitter.emit('event', 'a', 'b');
4.eventEmitter.once():用法和.on()一样,不过.once绑定的事件只触发一次,再次触发会被忽略。(node绝对是参考了jQ啊有木有~~)
5.‘error’事件,文档提到,如果一个EventEmitter运行过程中出现了错误,会抛出一个error事件;但如果EventEmitter没有监听error事件,而error被抛出,则node会打印堆栈的踪迹并退出进程。所以我们使用EventEmitter实例的时候往往要绑定一个error事件,哪怕只是log一下。
6.newListener事件会被触发当我们给EventEmitter实例绑定事件的时候;removeListener事件会被触发当我们移除事件的时候。
const myEmitter = new MyEmitter();
// Only do this once so we don't loop forever
myEmitter.once('newListener', (event, listener) => {
if (event === 'event') {
// Insert a new listener in front
myEmitter.on('event', () => {
console.log('B');
});
}
});
myEmitter.on('event', () => {
console.log('A');
});
myEmitter.emit('event');
// Prints:
// B
// A
这里要注意,在触发newListener是事件的时候,newListener的回调会在绑定新事件的时候执行,因此log(B)在'event'被触发的时候就注册了。
另外,代码第三行的listener参数,指向的是代码第12行的代码,即EventEmitter实例绑定'event'事件的回调。
7.EventEmitter.listenerCount(emitter, eventName):静态的方法,返回一个EventEmitter实例监听的某个事件到底绑定了多少个回调,在文档中,listener指的就是某个event的callback。
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Prints: 2
8.EventEmitter.defaultMaxListeners:默认的单个event最大listener数(对所有event都这样),为10,但实际上可以绑定第11、12个以上的listener,只是超过10个node会给出warning;
emitter.setMaxListeners(n) :改变单个event的限制。
.getMaxListeners():获取单个event的最大listener数,如果该event调用过.setMaxListeners(n)方法,则获取的是set后的值。
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
9.emitter.eventNames():返回一个数组,其元素是该EventEmitter实例绑定的事件名。
10.emitter.listenerCount(eventName):返回实例绑定的某个事件的lietener数。
11.emitter.listeners(eventName):返回一个数组,该数组成员是EventEmitter实例绑定的事件的lietener的副本。(个人觉得鸡肋)
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
12.emitter.prependListener(eventName, listener):将listener插入到某个event所注册的listeners队列的最前面,类似数组的unshift方法,由于event触发的时候listeners是按注册顺序逐个执行的,所以使用该方法的listener会第一个执行。
13.emitter.prependOnceListener(eventName, listener):跟上面的prependListener()方法一样,只是prependOnceListener插入的listener只触发一次。
14.emitter.removeAllListeners([eventName]):移除EventEmitter实例绑定的eventName的所有listeners。如果不传参,则该实例绑定的所有listeners都被移除。
15.emitter.removeListener(eventName, listener):移除某个事件。这个callback必须是个句柄,和DOM二级事件的removeEventListener一样。另外,由于同一个listener可以反复添加给某个event,在触发时也会反复执行,此时想彻底清除该事件就得多次使用removeListener。
好啦,events模块大体就这些方法。我是文档的搬运工。。。。。
node的events模块的更多相关文章
- node之events 模块,并通过实例化 EventEmitter 类来绑定和监听事件
例子来源:http://www.runoob.com/nodejs/nodejs-event-loop.html http://www.runoob.com/nodejs/nodejs-event.h ...
- node模块之events模块
events 模块只提供了一个对象: events.EventEmitter. [EventEmitter 的核心就是事件触发与事件监听器功能的封装.] EventEmitter 的每个事件由一个事件 ...
- node的事件模块应用(译)
第一次接触Node.js时,就觉得他只不过是用javascript实现的服务端.但实际上他提供了许多浏览器端不具备的方法,比如EventEmitter类.我们在本文中来学习如何使用EventEmitt ...
- events模块
/** * Created by Administrator on 2016/8/3. */ var http = require("http"); //Node 导入文件系统模块 ...
- node.js核心模块
全局对象 global 是全局变量的宿主 全局变量 在最外层定义的 全局对象的属性 隐士定义的变量(未定义直接赋值的变量) 当定义一个全局变量时 这个变量同时也会成为全局对象的属性 反之亦然 注意: ...
- 深入出不来nodejs源码-events模块
这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...
- node之path模块
node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...
- 运用node的文件系统模块批量修改文件名
如果我们需要大批量修改一个文件中的名称,比如,删除文件名中的副本时,就可以借助node的文件系统模块,快捷快速的完成. 首先建立一个js文件(changeName.js),代码如下: // 引入f ...
- Node.js的模块载入方式与机制
Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...
随机推荐
- 解释BOM头和去掉方法
http://www.thinkphp.cn/topic/2592.html 以上是叫你去掉bom头的,因为有些文件加载不出来就是window会以记事本的形式打开,然后默认给我们加了了bom头,有些文 ...
- qt 怎么让程序自带字体,就是说在操作系统上没有的字体
字体要加到.qrc文件中 QString Widget::loadFontFamilyFromTTF() { static QString font; static bool loaded = fal ...
- (转)如何学好C语言
原文:http://coolshell.cn/articles/4102.html 作者:陈皓 有人在酷壳的留言版上询问下面的问题 keep_walker : 今天晚上我看到这篇文章. http ...
- ElementUI表单验证攻略:解决表单项启用和禁用验证的切换,以及动态表单验证的综合性问题
试想一种比较复杂的业务场景: 表格(el-table)的每一行数据的第一列是勾选框,最后一列是输入框.当某一行的勾选框勾上时,启用该行的输入框,并开启该行输入框的表单验证:取消该行的勾选框,则禁用该行 ...
- ICML2016 TUTORIAL参会分享
本次ICML会议的tutorial安排在主会前一天.这次tutorial内容非常丰富,有微软亚研的hekaiming(已经跳去facebook)介绍深度残差网络,也有deepmind的david si ...
- 替换input单选框的样式
实现效果:. css的input单选框的样式很丑,有时候不想使用原生的样式,如上照片,可以使用下面的方法. 思路是,给inpu加visibility:hidden隐藏,然后使用不同的图片绝对定位覆盖在 ...
- [开发笔记]-unix时间戳、GMT时间与datetime类型时间之前的转换
前段时间项目中涉及到了MySql和MsSql数据类型之间的转换,最近又在研究新浪微博的API,涉及到了带有时区的GMT时间类型的转换,所以,特记录于此,以备日后查询. 一:UNIX时间戳与dateti ...
- 小老板,我300M的网,网速很慢怎么办?
首先考虑是不是DNS的问题: 我们先测试一下! 一.Google的DNS: 8.8.8.8 丢包严重 PASS但是扶墙的时候是必备的,如果有扶墙的需求的话可以备用. 二.百度DNS 180.76.76 ...
- USACO Training Section 1.1黑色星期五Friday the Thirteenth
题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...
- MySQL 数据库赋权
1.进入数据库,查看数据库账户 # 进入数据库 mysql –u root –p ---> 输入密码... # 使用 mysql 库 use mysql; # 展示 mysql 库中所有表 sh ...