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()的区别的主要内容,如果未能解决你的问题,请参考以下文章

nodejs的事件

手写EventBus自定义事件

abp.event.on与abp.event.off使用

python中如何调用js文件中的方法呢

markdown Ubuntu 16.04:LAMP w / NodeJS和WP-CLI

应用程序中未调用 Lifecycle.Event.ON_DESTROY