Nodejs中不存在浏览器中冒泡,捕获这些行为,Nodejs中实现了events这个模块,Nodejs中大多数模块都集成了这个模块,所以events是Nodejs中最重要的一个模块。

events只对外暴露一个对象,就是EventEmitter,EventEmitter作用只有2个,分别是:事件的发射和事件的监听。

Node.js中,很多对象会发出事件。如,fs.readStream打开文件时会发出一个事件。

所有发出事件的对象都是events.EventEmitter的实例,可以通过require("event");获得event模块。

监听器函数(listeners)可以添加给对象,对象发出事件时,对应的函数就会被执行。在监听器函数中,this引用的是它(监听器函数)

一、Class:events.EventEmitter

通过require('events').EventEmitter得到EventEmitter类。

当EventEmitter对象遇到错误时,通常会触发error事件。error事件在Nodejs中是一种特殊情况,如果没有监听器,那么默认会打印出栈跟踪器并退出程序。

二、添加监听器

为事件绑定事件处理程序,可以用emitter.addListener(event,listener)和emitter.on(event,listener),它们作用完全一样。传入参数是事件(event)和处理函数(listener)。

demo:test1.js内容如下

var http = require('http');
var server = http.createServer(); // 为request事件绑定处理函数
// 也可以使用server.addListener
server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou');
console.log('shiyanlou');
res.end();
}); server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

三、只执行一次的监听器

使用 emitter.once(event,listener)绑定的事件监听器只执行一次,然后就会被删除掉。

demo:test2.js内容如下

var http = require('http');
var server = http.createServer(); // 为request事件绑定处理函数,事件只会执行一次
server.once('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou');
console.log('shiyanlou');
res.end();
}); server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

四、移除监听器

移除监听器使用emitter.removeListener(event,listener);

demo:test3.js内容如下

var http = require('http');
var server = http.createServer(); function callback(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Hello World');
console.log('Hello World');
res.end();
} server.on('request', callback); // 移除绑定的监听器callback
server.removeListener('request', callback); server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou');
console.log('shiyanlou');
res.end();
}); server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

运行结果只显示shiyanliu,不显示hello world,因为“hello world”的监听器被移除了。
错误的移除事件不能移除匿名的事件处理程序,必须像上面一样移除具名函数。

server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou');
console.log('shiyanlou');
res.end();
});
//错误的移除事件方法
server.removeListener('request',function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou');
console.log('shiyanlou');
res.end();
});

五、移除所有监听器

移除所有监听器使用emitter.removeAllListener([event]) 。需要传入某种类型的事件参数,不传的话会把所有类型的事件监听都移除掉。

demo:test4.js内容如下:

var http = require('http');
var server = http.createServer(); server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou,111');
console.log('shiyanlou,111');
res.end();
}); server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou,222');
console.log('shiyanlou,222');
res.end();
}); // 移除绑定的所有监听器
server.removeAllListeners('request');
// 移除后再绑定一个有监听器
server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou');
console.log('shiyanlou');
res.end();
}); server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

浏览器只输出shiyanlou

六、设置监听器最大绑定数

EventEmitter支持多个事件监听器,最大值是10。即可用为某个事件添加10个监听函数,做10件事情。默认情况下,超过10个就好警告提示,

这能帮我们快速找到内存泄露的地方。

显然,不是所有的事件触发器都限制在10个监听器,通过emitter.setMaxLisstener(n) 可以设置同一事件的监听器最大绑定数,如果设置为0就是无限制

七、自定义事件

使用emitter.emit(event,[arg1],[arg2],[...]) 可以触发自定义的事件。

demo:test5.js内容如下

var http = require('http');
var server = http.createServer(); // 绑定自定义事件myevent
server.on('myevent', function(arg) {
console.log(arg);
}); // 触发自定义事件
server.emit('myevent', 'shiyanlou'); server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

运行结果在console界面输出shiyanlou,说明触发自定义事件成功。

八、查看事件绑定的监听器个数

使用EventEmitter.listenerCount(emitter,event) 可以查看事件监听器数量。

也可以用emitter.listeners('event').length;来查看。

demo:test6.js内容如下

var http = require('http');
var events = require('events'); // 加载events模块
var server = http.createServer(); server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou,111');
console.log('shiyanlou,111');
res.end();
}); server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou,222');
console.log('shiyanlou,222');
res.end();
}); server.listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/'); //2种方法 查看server绑定的'request'事件的监听器个数
var num = events.EventEmitter.listenerCount(server, 'request');
var num2=server.listeners('request'
).length;
console.log(num);

console.log(num2);

2种方法运行结果都输出了2,因为server绑定了两个监听器到"request"事件。

九、排错

Error:write after end【update20170327】

server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou,111');
console.log('shiyanlou,111');
res.end();
}); server.on('request', function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('shiyanlou,222');
console.log('shiyanlou,222');
res.end();
});

Once a writable stream is closed, it cannot accept anymore data。server绑定了2个request事件处理程序,第一个在res.write()后调用了res.end()结束了写入流,所以再次调用res.write('shiyanlou,222');就会报错,可以注释掉第一end()调用。

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/5035522.html有问题欢迎与我讨论,共同进步。

// 移除绑定的所有监听器

nodejs模块——Event模块的更多相关文章

  1. CentOS 6编译安装lamp,并分别安装event模块方式和FPM方式的PHP

    任务目标: 编译安装LAMP 要求(1) 安装一个模块化的PHP 要求(2) 安装一个FPM的PHP 注意PHP需要最后一个安装,因为需要前两者的支持. 所以这里的安装次序为 1.httpd 2.Ma ...

  2. Backbone源码解析(一):Event模块

    Backbone是一个当下比较流行的MVC框架.它主要分为以下几个模块: Events, View, Model, Collection, History, Router等几大模块.它强制依赖unde ...

  3. nodejs——网络编程模块

    net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法.dgram模块用于UDP网络编程. 参考链接:https://nodejs.org/api/net.html, ...

  4. 关于Nodejs的多进程模块Cluster

    关于Nodejs的多进程模块Cluster   前述 我们都知道nodejs最大的特点就是单进程.无阻塞运行,并且是异步事件驱动的.Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并 ...

  5. Nodejs中cluster模块的多进程共享数据问题

    Nodejs中cluster模块的多进程共享数据问题 前述 nodejs在v0.6.x之后增加了一个模块cluster用于实现多进程,利用child_process模块来创建和管理进程,增加程序在多核 ...

  6. nodejs的require模块及路径

    在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文 ...

  7. 使用nodejs的net模块创建TCP服务器

    使用nodejs的net模块创建TCP服务器 laiqun@msn.cn Contents 1. 代码实现 2. 使用telnet连接服务器测试 3. 创建一个TCP的client 1. 代码实现 ; ...

  8. 使用nodejs的http模块创建web服务器

    使用nodejs的http模块创建web服务器 laiqun@msn.cn Contents 1. web服务器基础知识 2. Node.js的Web 服务器 3. 代码实现 1. web服务器基础知 ...

  9. nginx源码分析——event模块

    源码:nginx 1.12.0   一.简介      nginx是一款非常受欢迎的软件,具备高性能.模块化可定制的良好特性.之前写了一篇nginx的http模块分析的文章,主要对http处理模块进行 ...

随机推荐

  1. HubSpot – 网站开发必备的 jQuery 信息提示库

    HubSpot 一款功能丰富的 jQuery 消息提示插件.它可以帮助你个性化显示您的应用程序的事务性消息.您可以轻松地包裹 Ajax 请求进度,成功和错误消息,还可以添加操作链接到您的消息中. Hu ...

  2. Captain Icon – 350+ 有趣的矢量图标免费下载

    Captain Icon 是一套一个惊人的免费图标集,包含350+有趣的矢量图标,可以缩放到任意大小而不会降低质量.图标的类别很丰富,有设计,体育,社会,天气等很多类别.提供 EPS.PSD.PNG. ...

  3. Navicat for Oracle实现连接Oracle

    不知道为什么,从一开始,我就不喜欢Oracle,名字好听,功能强大,但总感觉"高不可攀";或许是因为我觉得其他的数据库就可以解决数据问题,不太了解Oracle的优势:而且它长得也不 ...

  4. Sql Server 2008 数据库附加失败提示9004错误解决办法

    附加数据库 对于 服务器“WSS_Content”失败.  (Microsoft.SqlServer.Smo)执行 Transact-SQL 语句或批处理时发生了异常. (Microsoft.SqlS ...

  5. 为ListView组件加上快速滑块以及修改快速滑块图像

    本文转载自:http://blog.csdn.net/ouyang_peng/article/details/46919723 作者:欧阳鹏  欢迎转载,与人分享是进步的源泉! 转载请保留原文地址:h ...

  6. Android Content Provider Guides

    Android Content Provider Guides Content Providers管理对结构化数据集的访问.它们包装数据,并且提供一种定义数据安全的机制. Content provid ...

  7. mysql 时间函数转换

    1 NOW() //当前时间 2 SYSDATE() //当前时间 3 CURRENT_TIMESTAMP 4 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的 ...

  8. 对抽屉效果几大github第三方库的调研

    在公司项目新版本方案选择中,对主导航中要使用的抽屉效果进行了调研.主要原因是旧的项目中所用的库ECS评价不是很好.现对当下比较火的几大热门抽屉效果的第三方库进行了调研.代码全部选自github 如果你 ...

  9. 【代码笔记】iOS-底下滚动,上面标题栏也会跟着变动

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import "SVSegmentedCont ...

  10. 【读书笔记】iOS-ASIHTTPRequest框架的使用。

    一,安装和配置ASIHTTPRequest框架. 二,同步请求. 在ASIHTTPRequest框架中与HTTP请求相关的类有:ASIHTTPRequest和ASIFormDataRequest,其中 ...