Node.js events emitter.setMaxListeners

🌙
手机阅读
本文目录结构

Node.js events emitter.setMaxListeners(n)

新增于: v0.3.5

  • n < integer>
  • 返回: < EventEmitter> 默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 这有助于发现内存泄露。

但是,并不是所有的事件都要限制 10 个监听器。

emitter.setMaxListeners() 方法可以为指定的 EventEmitter 实例修改限制。 值设为 Infinity(或 0)表示不限制监听器的数量。

返回对 EventEmitter 的引用,以便可以链式调用。

常见错误解决

如果您遇到类似下面的错误;使用 request 等模块发送请求,当请求多的时候就出现这个警告!

 (node) warning: possible EventEmitter memory leak detected. 11 listeners added. 
 Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:168:15)
    at Socket.EventEmitter.once (events.js:189:8)
    at Socket.setTimeout (net.js:173:12)
    at ClientRequest.setTimeout (http.js:1557:17)
    at ClientRequest.setTimeout (http.js:1569:10)
    at ClientRequest.g (events.js:185:14)
    at ClientRequest.EventEmitter.emit (events.js:115:20)
    at ClientRequest.onSocket (http.js:1514:9)
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

治标方法:

var req=http.request(options,function(res){
    //......
});
/** 此处为req.once,而非req.on,二者区别见官方文档api说明**/
req.once('socket',function(socket){
    /** 默认listener数是10,提高到20应该足够**/
    socket.setMaxListeners(20);
});

治本的方法,推荐使用下面这种的

将timeout的回调函数独立出来,在response事件之后手动注销timeout的监听

var req=http.request(options,function(res){
    req.removeAllListeners();//clear out all listeners
    req.setTimeout(0,timeout_callback);//clear out timeout listener
    //do more work.......
});
function timeout_callback(){
    //abort request?......
}
/** for example, timeout in 30s**/
req.setTimeout(30000,timeout_callback);

更多node event中的方法属性和事件,可以进入 node events EventEmitter 类 进行查看


更多内容请参考:Node.js events 事件触发器,或者通过 点击对应菜单 进行查看;



AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

目前重心已经放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>