web-dev-qa-db-fra.com

Différence b/w event.on () et event.once () dans nodejs

Je teste l'application plus_one et, tout en l'exécutant, je voulais simplement clarifier mes concepts sur event.once () et event.on ().

C'est 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");
        }
    });

et c'est 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);

Je reçois quelques avertissements de décalage maxlistener lors de l’utilisation de child.stdin.on () mais ce n’est pas le cas lorsqu’on utilise child.stdin.once (), pourquoi cela se produit-il?

Est-ce parce que child.stdin écoute les entrées précédentes? mais dans ce cas, maxlistener offset devrait être défini plus fréquemment, mais cela ne se produit qu'une ou deux fois par minute.

25
Anathema.Imbued

En utilisant EventEmitter.on(), vous attachez un auditeur complet, alors que lorsque vous utilisez EventEmitter.once(), il s'agit d'un auditeur unique qui se détache après avoir tiré une fois. Les auditeurs qui ne déclenchent qu'une seule fois ne comptent pas dans le nombre maximal d'auditeurs.

38
hexacyanide

Selon les derniers documents officiels https://nodejs.org/api/events.html#events_eventemitter_defaultmaxlisteners . L’écouteur .once () compte pour les maxlisteners.

emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
  // do stuff
  emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
1
Yuefei Ma