nodejs中的b / w event.on()和event.once()的区别
Posted
技术标签:
【中文标题】nodejs中的b / w event.on()和event.once()的区别【英文标题】:Difference b/w event.on() and event.once() in nodejs 【发布时间】:2013-09-15 09:57:15 【问题描述】:我正在测试 plus_one 应用程序,在运行它时,我只是想澄清一下我对 event.once() 和 event.on() 的概念
这是 plus_one.js
> process.stdin.resume();
process.stdin.on('data',function(data)
var number;
try
number=parseInt(data.toString(),10);
number+=1;
process.stdout.write(number+"\n");
catch(err)
process.stderr.write(err.message+"\n");
);
这是 test_plus_one.js
var spawn=require('child_process').spawn;
var child=spawn('node',['plus_one.js']);
setInterval(function()
var number=Math.floor(Math.random()*10000);
child.stdin.write(number+"\n");
child.stdout.on('data',function(data)
console.log('child replied to '+number+' with '+data);
);
,1000);
我在使用 child.stdin.on() 时收到一些 maxlistener 偏移警告,但在使用 child.stdin.once() 时却不是这样,为什么会发生这种情况?
是因为 child.stdin 正在听以前的输入吗?但在这种情况下,应该更频繁地设置 maxlistener 偏移量,但它只会在一分钟内发生一次或两次。
【问题讨论】:
【参考方案1】:根据最新的官方文档https://nodejs.org/api/events.html#events_eventemitter_defaultmaxlisteners。 .once() 侦听器确实计入 maxlisteners。
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () =>
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
);
【讨论】:
【参考方案2】:使用EventEmitter.on()
,您附加一个完整的侦听器,而当您使用EventEmitter.once()
,它是一个一次性侦听器,在触发一次后将分离。仅触发一次的侦听器不计入最大侦听器计数。
【讨论】:
以上是关于nodejs中的b / w event.on()和event.once()的区别的主要内容,如果未能解决你的问题,请参考以下文章