web-dev-qa-db-ja.com

nodejsのb / w event.on()とevent.once()の違い

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分間に1〜2回だけ発生します。

29
Anathema.Imbued

EventEmitter.on()を使用すると、完全なリスナーをアタッチしますが、EventEmitter.once()を使用する場合は、一度起動した後でデタッチする1回限りのリスナーです。 1回だけ起動するリスナーは、最大リスナー数にカウントされません。

41
hexacyanide

最新の公式ドキュメントによると 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));
});
1
Yuefei Ma