美文网首页我爱编程
Node.js Events模块

Node.js Events模块

作者: 张金宇 | 来源:发表于2016-09-14 08:46 被阅读0次

Node.js Events模块

实验简介:

  • 在Node.js中,很多对象都会发出事件。比如,fs.readStream
    打开文件时会发出一个事件。所有发出事件的对象都是events.EventEmitter
    的实例,可以通过require("events");获得event模块。
  • 通常,事件名采用“驼峰式”命名方式,但是,并没有严格规定。这只是推荐的命名方法。
  • 函数可以添加给对象,对象发出事件时,对应函数就会被执行。这些函数被称作监听器(listeners)。在监听器函数中,this引用的是它(指此监听器函数)添加到的EventEmitter对象。

Class: events.EventEmitter

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

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

添加监听器

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

在虚拟机桌面新建文件test1.js,输入如下代码并保存:
<pre>
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/');
</pre>
运行代码:
<pre>
shiyanlou@sdf234jh4:~$ cd Desktop
shiyanlou@sdf234jh4:~/Desktop$ node test1.js
</pre>

然后打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,
即可看到页面上打印出了“shiyanlou”字样,
同时console界面也会输出'shiyanlou'字样。

只执行一次的监听器

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

在虚拟机桌面新建文件test2.js,输入如下代码并保存:
<pre>
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/');
</pre>
运行代码:
<pre>
shiyanlou@sdf234jh4:~/Desktop$ node test2.js
</pre>
打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,
即可看到页面上打印出了“shiyanlou”字样,再次刷新此页面,就不会再显示,因为此事件只会执行一次.


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

在虚拟机桌面新建文件test3.js,输入如下代码并保存:
<pre>
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/');
</pre>

运行代码:
<pre>
shiyanlou@sdf234jh4:~/Desktop$ node test3.js
</pre>
打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,
即可看到页面上打印出了“shiyanlou”字样,为什么没有显示“Hello World”呢?
因为显示“Hello World”的监听器被移除了。

移除所有监听器

移除所有监听器使用emitter.removeAllListeners([event])。
在虚拟机桌面新建文件test4.js,输入如下代码并保存:
<pre>
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/');
</pre>
运行代码:
<pre>
shiyanlou@sdf234jh4:~/Desktop$ node test4.js
</pre>
打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,
即可看到页面上打印出了“shiyanlou”字样,
说明前面的监听器被移除了,都没有执行,所以没有显示,
同时console界面也只会输出'shiyanlou'字样。

设置监听器最大绑定数emitter.setMaxListeners(n)

可以设置同一事件的监听器最大绑定数,默认情况下,超过10个就会警告提示,
这能帮我们快速找到类存泄露的地方。显然,不是所有的事件触发器都限制在10个监听器
,通过这个方法可以设置,如果设置为0就是无限制。

自定义事件

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

在虚拟机桌面新建文件test5.js,输入如下代码并保存:
<pre>
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/');
</pre>
运行代码:
<pre>
shiyanlou@sdf234jh4:~/Desktop$ node test5.js
</pre>
可以看到console界面输出了'shiyanlou'字样,说明触发自定义事件成功。


查看事件绑定的监听器个数<
使用EventEmitter.listenerCount(emitter, event)可以查看事件监听器数量。
在虚拟机桌面新建文件test6.js,输入如下代码并保存:
<pre>
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/');

// 查看server绑定的'request'事件的监听器个数
var num = events.EventEmitter.listenerCount(server, 'request');
console.log(num);
</pre>
运行代码:
<pre>
shiyanlou@sdf234jh4:~/Desktop$ node test6.js
</pre>
可以看到console界面输出了数字“2”,因为server绑定了两个监听器到'request'事件。

相关文章

  • Nodejs学习第8天

    Events - events模块是Node.js的核心模块、核心API之一,它是Node.js事件驱动模型的核...

  • Nodejs学习笔记(二)--- 事件模块

    1、简介 events是node.js 最重要的模块,events模块只提供了一个对象events.EventEm...

  • Node.js 的 events 模块

    Node.js 没有浏览器的事件冒泡、事件捕获机制。 events 模块是 Node.js 基础及重要的模块, 只...

  • JS原生实现EventEmitter事件队列

    EventEmitter 是什么 Node.js 的 events 模块对外提供了一个 EventEmitter ...

  • Node.js Events模块

    Node.js Events模块 实验简介: 在Node.js中,很多对象都会发出事件。比如,fs.readStr...

  • 事件驱动程序

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类...

  • Node.js(三):Events模块

    1、通常,事件名采用驼峰式命名方式。2、对象发出来的事件需要有函数来获取并处理,对此,需要先使一个事件与一个相响应...

  • node.js events事件模块

    1、EventEmitter来自events模块。调用的时候为: 2、所有能触发事件的对象都是 EventEmit...

  • 实现一个EventEmitter类

    EventEmitter是Node.js的内置模块events提供的一个类,它是Node事件流的核心。 下面模拟实...

  • Events 模块

    Events 是 node.js 中一个非常重要的 模块。 所有能触发事件的对象都是EventEmitter类的实...

网友评论

    本文标题:Node.js Events模块

    本文链接:https://www.haomeiwen.com/subject/opemettx.html