Maison  >  Article  >  interface Web  >  Une analyse approfondie du module d'événements dans nodejs

Une analyse approfondie du module d'événements dans nodejs

青灯夜游
青灯夜游avant
2021-03-01 10:41:214852parcourir

Cet article vous présentera en détail le module d'événements dans node. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Une analyse approfondie du module d'événements dans nodejs

Recommandations associées : "tutoriel nodejs"

le module d'événements est le module principal de node et presque tous les modules de nœuds couramment utilisés héritez des modules d'événements, tels que http, fs, etc. Cet article présentera en détail le mécanisme d'événements dans nodeJS

EventEmitter

La plupart des API principales de Node.js adoptent une architecture événementielle asynchrone idiomatique, dans laquelle certains types d'objets (appelés déclencheurs) L'événement nommé est déclenché périodiquement pour appeler l'objet fonction (écouteur). Par exemple, un objet net.Server déclenchera un événement à chaque nouvelle connexion ; un fs.ReadStream déclenchera un événement à l'ouverture d'un fichier ; un flux déclenchera un événement lorsque les données seront lisibles.

【EventEmitter】

La classe EventEmitter est définie et ouverte par le module d'événements. Tous les objets pouvant déclencher des événements sont des instances de la classe EventEmitter

var EventEmitter = require('events');
/*
{ [Function: EventEmitter]
  EventEmitter: [Circular],
  usingDomains: false,
  defaultMaxListeners: [Getter/Setter],
  init: [Function],
  listenerCount: [Function] }
 */
console.log(EventEmitter);

L'attribut EventEmitter de. le module d'événements pointe vers Le module lui-même

var events = require('events');
console.log(events.EventEmitter === events);//true

EventEmitter est un constructeur qui peut être utilisé pour générer des instances de générateurs d'événements émetteur

var EventEmitter = require('events');
var emitter = new EventEmitter();
/*
EventEmitter {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined }
 */
console.log(emitter);

méthode

[emitter.emit(eventName [, .. .args])】

eventName <any>
...args <any>

Cette méthode appelle de manière synchrone chaque écouteur enregistré à l'événement nommé eventName dans l'ordre dans lequel les écouteurs sont enregistrés et transmet les paramètres fournis. Si l'événement a un écouteur, retournez true, sinon retournez false

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test1',function(){});
console.log(emitter.emit('test1'));//true
console.log(emitter.emit('test2'));//false

[emitter.on(eventName, Listener)]

 Cette méthode est utilisée pour ajouter la fonction d'écouteur à l'événement nommé eventName Fin du tableau d'écoute

eventName <any> 事件名
listener <Function> 回调函数

[Note] Ne vérifie pas si l'écouteur a été ajouté. Appeler plusieurs fois et transmettre le même eventName et le même écouteur entraînera l'ajout et l'appel de l'écouteur plusieurs fois

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
});
emitter.on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2

Cette méthode renvoie une référence EventEmitter, qui peut être appelée dans une chaîne

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).on('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2

[emitter.addListener( eventName, Listener)】

Alias ​​​​de submitter.on(eventName, Listener)

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){
    console.log(1);
});
emitter.emit('test');//1

【emitter.prependListener()】

Contrairement au on(), la méthode prependListener() peut être utilisée pour ajouter un écouteur d'événement au début du tableau d'écoute

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1

[emitter.once(eventName, Listener)]

Cette méthode ajoute une fonction d'écoute unique pour les événements eventName. La prochaine fois que l'événement eventName sera déclenché, l'écouteur sera supprimé puis appelé

eventName <any> 事件名
listener <Function> 回调函数
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).once('test',function(){
    console.log(2);
});
emitter.emit('test');//1 2
emitter.emit('test');//1

[emitter.prependOnceListener()]

Cette méthode est utilisée pour ajouter l'écouteur d'événement au début de le tableau d'écoute . La prochaine fois que l'événement eventName sera déclenché, l'écouteur sera supprimé, puis appellera

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).prependOnceListener('test',function(){
    console.log(2);
});
emitter.emit('test');//2 1
emitter.emit('test');//1

[emitter.removeAllListeners([eventName])]

eventName <any>

  pour supprimer tous les écouteurs eventName ou ceux spécifiés, Renvoie une référence EventEmitter, qui peut être appelée dans une chaîne

[Note] C'est une mauvaise pratique de supprimer les écouteurs ajoutés ailleurs dans le code, en particulier lorsque l'instance EventEmitter est un autre composant ou module (tel qu'un socket ou file stream) créé par 🎜> [Note] removeListener ne supprimera qu'au plus une instance d'écouteur du tableau d'écouteurs. Si un seul écouteur est ajouté plusieurs fois au tableau d'écouteurs pour le nom d'événement spécifié, RemoveListener doit être appelé plusieurs fois pour supprimer chaque instance

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
}).removeAllListeners('test');
emitter.emit('test');//''

 [Note] Une fois qu'un événement est déclenché, toutes les liaisons. être déclenché dans l'ordre. Cela signifie que tout appel à removeListener() ou removeAllListeners() après le déclenchement de l'événement mais avant que le dernier écouteur ait fini de s'exécuter ne les supprimera pas d'emit(). Les événements ultérieurs se produiront comme prévu

Étant donné que les écouteurs sont gérés à l'aide de tableaux internes, l'appel de ceci modifiera l'index de position de tous les écouteurs enregistrés après la suppression de l'écouteur. Bien que cela n'affecte pas l'ordre dans lequel les auditeurs sont appelés, cela signifie qu'une copie du tableau d'écouteurs renvoyé par la méthode slicer.listeners() doit être recréée

eventName <any>
listener 

settings

[ émetteur.eventNames( )】

Renvoie un tableau répertoriant les événements pour lesquels le déclencheur a enregistré des écouteurs. Les valeurs du tableau sont des chaînes ou des symboles

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.emit('test');//''

[emitter.listenerCount(eventName)]

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).on('test',show).removeListener('test',show);
emitter.emit('test');//'1'

Renvoie le nombre d'auditeurs qui écoutent l'événement nommé eventName

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show1(){
    console.log(1);
    emitter.removeListener('test',show2);
}
function show2(){
    console.log(2);
}
emitter.on('test',show1).on('test',show2);
emitter.emit('test');//1 2
emitter.emit('test');//1

[emitter.listeners(eventName)]

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test1',function(){console.log(1);});
emitter.addListener('test2',function(){console.log(2);});
console.log(emitter.eventNames());//[ 'test1', 'test2' ]

Renvoie une copie du tableau d'écoute pour l'événement nommé eventName

eventName <any> 正在被监听的事件名

[emitter.getMaxListeners()]

Renvoie EventEmitter La valeur limite maximale actuelle de l'auditeur

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.addListener('test',function(){console.log(1);});
emitter.addListener('test',function(){console.log(1);});
console.log(emitter.listenerCount('test'));//2

[emitter.setMaxListeners(n)]

  默认情况下,如果为特定事件添加了超过 10 个监听器,则 EventEmitter 会打印一个警告。 此限制有助于寻找内存泄露。 但是,并不是所有的事件都要被限为 10 个。 emitter.setMaxListeners() 方法允许修改指定的 EventEmitter 实例的限制。 值设为 Infinity(或 0)表明不限制监听器的数量。返回一个 EventEmitter 引用,可以链式调用

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});
/*
Warning: Possible EventEmitter memory leak detected. 11 a listeners added. Use emitter.setMaxListeners() to increase limit
 */
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.setMaxListeners(11);
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});

【EventEmitter.defaultMaxListeners】
  每个事件默认可以注册最多10个监听器。单个EventEmitter实例的限制可以使用emitter.setMaxListeners(n)方法改变。所有EventEmitter实例的默认值可以使用EventEmitter.defaultMaxListeners属性改变

  [注意]设置 EventEmitter.defaultMaxListeners 要谨慎,因为会影响所有EventEmitter 实例,包括之前创建的。因而,调用 emitter.setMaxListeners(n) 优先于 EventEmitter.defaultMaxListeners

var EventEmitter = require('events');var emitter = new EventEmitter();
EventEmitter.defaultMaxListeners = 11;
emitter.on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){}).on('a',function(){});

事件

【'newListener' 事件】

eventName <any> 要监听的事件的名称
listener  事件的句柄函数

  EventEmitter 实例会在一个监听器被添加到其内部监听器数组之前触发自身的 'newListener' 事件

  注册了 'newListener' 事件的监听器会传入事件名与被添加的监听器的引用。事实上,在添加监听器之前触发事件有一个微妙但重要的副作用: 'newListener' 回调中任何额外的被注册到相同名称的监听器会在监听器被添加之前被插入 

var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('newListener',function(){
    console.log(2);
})
emitter.on('test',function(){
    console.log(1);
})

emitter.emit('test');//2 1
var EventEmitter = require('events');
var emitter = new EventEmitter();
emitter.on('test',function(){
    console.log(1);
})
emitter.on('newListener',function(){
    console.log(2);
})
emitter.emit('test');//1

【'removeListener' 事件】

eventName <any> 事件名
listener  事件句柄函数

  'removeListener' 事件在 listener 被移除后触发

var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('removeListener',function(){
    console.log(2);//2})
emitter.on('test',show).removeListener('test',show);
var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.on('test',show).removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})
var EventEmitter = require('events');
var emitter = new EventEmitter();
function show(){
    console.log(1);
}
emitter.removeListener('test',show);
emitter.on('removeListener',function(){
    console.log(2);//''})

更多编程相关知识,请访问:编程视频!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer