当前位置: 首页 > news >正文

nodejs学习笔记-EventEmitter使用

EventEmitter

在nodejs中有一个EventEmitter类,目的是实现各种事件的event处理。当需要指定绑定事件时,可以使用EventEmitter类的on方法或addListener方法.这两个方法实现原理相同,只是名称不一样.这两个方法都有两个参数,第一个参数为指定事件名 第二个参数为该事件的事件处理函数:

javascriptvar http = require('http');
var server = http.createServer();
server.addListener('request', function(req, res) {
    console.log('addListener');
    res.end();
})
server.on('request', function(req, res) {
    console.log('on');
    res.end();
})

setMaxListeners()

在默认情况下,同一个指定的事件,最多可以绑定10个事件处理函数。也可以通过下面的方法修改:

javascriptvar http = require('http');
var server = http.createServer();
server.setMaxListeners(5);
server.addListener('request', function(req, res) {
    console.log('mark');
    res.end();
})

也可以指定最多绑定5个,当绑定数超出时,启动nodejs时,会有相应的错误提示。

javascript(node) warning: possible EventEmitter memory leak detected. 6 request listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Server.addListener (events.js:179:15)
    at Object.<anonymous> (/Users/demacia/nodejs-mark/event_emitter.js:41:8)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

emitter.once()和emitter.on()

emitter.once()与emitter.on()方法类似区别在于,emitter.once()当事件处理函数,执行一次后会立即解除,该事件处理函数只会执行一次。


removeListener()

可以解除某个事件处理函数:

javascriptvar http = require('http');
var server = http.createServer();
var mark = function(req, res) {
    console.log('mark');
    res.end();
}
server.addListener('request', mark);
server.removeListener('request', mark);

removeAllListeners()

可以取消所有事件处理函数:

javascriptvar http = require('http');
var server = http.createServer();
server.addListener('request', function(req, res) {
    console.log(1);
    res.end();
})
server.addListener('request', function(req, res) {
    console.log(2);
    res.end();
})
server.removeAllListeners('request');

listenerCount()

获取事件处理函数的数量:

javascriptvar http = require('http');
var events = require('events');
var server = http.createServer();
server.addListener('request', function(req, res) {
    console.log(1);
    res.end();
})
server.addListener('request', function(req, res) {
    console.log(2);
    res.end();
})
console.log(events.EventEmitter.listenerCount(server, 'request'));

newListener()

任何时候当继承EventEmitter类的子类实例化对象绑定事件处理函数时,都将触发EventEmitter类的newListener事件

javascriptvar http = require('http');
var server = http.createServer();
var mark = function(req, res) {
    console.log('mark');
    res.end();
}
server.on('newListener', function(e, f) {
    console.log('newListener');
});
server.on('removeListener', function(e, f) {
    console.log('removeListener');
});
server.addListener('request', mark);

以上代码执行结果为:输出两次newListener因为removeListener方法也是属于新绑定的事件处理函数

removeListener()

任何时候当继承removeListener类的子类实例对象取消处理函数时,都将触发EventEmitter类的removeListener事件

javascriptvar http = require('http');
var server = http.createServer();
var mark = function(req, res) {
    console.log('mark');
    res.end();
}
server.on('newListener', function(e, f) {
    console.log('newListener');
});
server.on('removeListener', function(e, f) {
    console.log('removeListener');
});
server.addListener('request', mark);
server.removeListener('request', mark);

执行结果为:输出两次newListener和一次removeListener

相关文章:

  • 二维数组
  • C#中的基本数据类型
  • 恢复HP C7000 OA(Onboard Administrator)密码
  • 如何实现可动态调整隐藏header的listview
  • GeoGlobe Server运维
  • redis之sentinel
  • Linking different libraries for Debug and Release builds in Cmake on windows?
  • java中final关键字的总结
  • TCP/IP 网络编程(六)
  • Android开发框架--AndroidAnnotations(一)
  • 图片缓存负载
  • 最大流问题
  • 它们的定义app.config中间section节点和在执行中使用
  • 如何让mysql的自动递增的字段重新从1开始呢?(
  • read by other session的优化记录
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • create-react-app做的留言板
  • Go 语言编译器的 //go: 详解
  • JavaScript学习总结——原型
  • php ci框架整合银盛支付
  • React as a UI Runtime(五、列表)
  • React+TypeScript入门
  • React-redux的原理以及使用
  • SpingCloudBus整合RabbitMQ
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 编写高质量JavaScript代码之并发
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 反思总结然后整装待发
  • 分布式熔断降级平台aegis
  • - 概述 - 《设计模式(极简c++版)》
  • 深入浅出Node.js
  • 微信小程序开发问题汇总
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define与typedef区别
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (三分钟)速览传统边缘检测算子
  • (转) 深度模型优化性能 调参
  • (转)winform之ListView
  • .NET 反射的使用
  • .Net6使用WebSocket与前端进行通信
  • .Net程序帮助文档制作
  • .net下的富文本编辑器FCKeditor的配置方法
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++]unordered系列关联式容器