38

我正在测试 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 偏移量,但它只会在一分钟内发生一次或两次。

4

2 回答 2

63

使用EventEmitter.on(),您附加一个完整的侦听器,而当您使用 时EventEmitter.once(),它是一个一次性侦听器,在触发一次后将分离。仅触发一次的侦听器不计入最大侦听器计数。

于 2013-09-11T13:23:05.363 回答
8

根据最新的官方文档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));
});
于 2018-07-25T02:05:29.477 回答