nodejs event模块

在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,输入如下代码并保存:


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

运行代码:


  
  
  1. shiyanlou @sdf234jh4 :~ $ </span>cd <span class="hljs-constant" style="color:rgb(242,119,122);">Desktop</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">shiyanlou<span class="hljs-variable" style="color:rgb(242,119,122);">@sdf234jh4</span><span class="hljs-symbol" style="color:rgb(153,204,153);"><span class="hljs-symbol">:~/Desktop</span></span><span class="hljs-variable" style="color:rgb(242,119,122);">$ node test1.js

浏览器地址栏输入127.0.0.1:1337,即可看到页面上打印出了“shiyanlou”字样,同时console界面也会输出’shiyanlou’字样。

只执行一次的监听器

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

在虚拟机桌面新建文件test2.js,输入如下代码并保存:


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

运行代码:

shiyanlou@sdf234jh4:~/Desktop$ node test2.js

  
  

打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,即可看到页面上打印出了“shiyanlou”字样,再次刷新此页面,就不会再显示,因为此事件只会执行一次。

移除监听器

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

在虚拟机桌面新建文件test3.js,输入如下代码并保存:


  
  
  1. var http = require( 'http');
  2. var server = http.createServer();
  3. function callback(req, res) {
  4. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  5. res.write( 'Hello World');
  6. console.log( 'Hello World');
  7. res.end();
  8. }
  9. server.on( 'request', callback);
  10. // 移除绑定的监听器callback
  11. server.removeListener( 'request', callback);
  12. server.on( 'request', function(req, res) {
  13. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  14. res.write( 'shiyanlou');
  15. console.log( 'shiyanlou');
  16. res.end();
  17. });
  18. server.listen( 1337, '127.0.0.1');
  19. console.log( 'Server running at http://127.0.0.1:1337/');

运行代码:

shiyanlou@sdf234jh4:~/Desktop$ node test3.js

  
  

打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,即可看到页面上打印出了“shiyanlou”字样,为什么没有显示“Hello World”呢?因为显示“Hello World”的监听器被移除了。

移除所有监听器

移除所有监听器使用emitter.removeAllListeners([event])

在虚拟机桌面新建文件test4.js,输入如下代码并保存:


  
  
  1. var http = require( 'http');
  2. var server = http.createServer();
  3. server.on( 'request', function(req, res) {
  4. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  5. res.write( 'shiyanlou,111');
  6. console.log( 'shiyanlou,111');
  7. res.end();
  8. });
  9. server.on( 'request', function(req, res) {
  10. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  11. res.write( 'shiyanlou,222');
  12. console.log( 'shiyanlou,222');
  13. res.end();
  14. });
  15. // 移除绑定的所有监听器
  16. server.removeAllListeners( 'request');
  17. server.on( 'request', function(req, res) {
  18. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  19. res.write( 'shiyanlou');
  20. console.log( 'shiyanlou');
  21. res.end();
  22. });
  23. server.listen( 1337, '127.0.0.1');
  24. console.log( 'Server running at http://127.0.0.1:1337/');

运行代码:

shiyanlou@sdf234jh4:~/Desktop$ node test4.js

  
  

打开虚拟机桌面的Firefox浏览器,在地址栏输入127.0.0.1:1337,即可看到页面上打印出了“shiyanlou”字样,说明前面的监听器被移除了,都没有执行,所以没有显示,同时console界面也只会输出’shiyanlou’字样。

设置监听器最大绑定数

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

自定义事件

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

在虚拟机桌面新建文件test5.js,输入如下代码并保存:


  
  
  1. var http = require( 'http');
  2. var server = http.createServer();
  3. // 绑定自定义事件myevent
  4. server.on( 'myevent', function(arg) {
  5. console.log(arg);
  6. });
  7. // 触发自定义事件
  8. server.emit( 'myevent', 'shiyanlou');
  9. server.listen( 1337, '127.0.0.1');
  10. console.log( 'Server running at http://127.0.0.1:1337/');

运行代码:

shiyanlou@sdf234jh4:~/Desktop$ node test5.js

  
  

可以看到console界面输出了’shiyanlou’字样,说明触发自定义事件成功。

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

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

在虚拟机桌面新建文件test6.js,输入如下代码并保存:


  
  
  1. var http = require( 'http');
  2. var events = require( 'events'); // 加载events模块
  3. var server = http.createServer();
  4. server.on( 'request', function(req, res) {
  5. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  6. res.write( 'shiyanlou,111');
  7. console.log( 'shiyanlou,111');
  8. res.end();
  9. });
  10. server.on( 'request', function(req, res) {
  11. res.writeHead( 200, { 'Content-Type': 'text/plain' });
  12. res.write( 'shiyanlou,222');
  13. console.log( 'shiyanlou,222');
  14. res.end();
  15. });
  16. server.listen( 1337, '127.0.0.1');
  17. console.log( 'Server running at http://127.0.0.1:1337/');
  18. // 查看server绑定的'request'事件的监听器个数
  19. var num = events.EventEmitter.listenerCount(server, 'request');
  20. console.log(num);

运行代码:

shiyanlou@sdf234jh4:~/Desktop$ node test6.js

  
  

可以看到console界面输出了数字“2”,因为server绑定了两个监听器到’request’事件。

转载自:https://blog.csdn.net/xy2204/article/details/46986071

猜你喜欢

转载自blog.csdn.net/Ruffaim/article/details/81201272