Node.js odesílá varování, když do emitoru události přidáte příliš mnoho posluchačů

Dnes jsem četl dokumentaci událostí v Node.js a objevil jsem něco zajímavého.

Když je používáte, obvykle také používáte EventEmitter . Pojďme se rychle podívat na ukázkový úryvek z dokumentů.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

Použití je přímočaré. Vytvořte emitor, vyzařujte události a reagujte na ně. Pojďme změnit kód výše a přidat několik dalších obslužných rutin událostí.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
for(let i = 0; i < 11; i++) {
  myEmitter.on('event', _ => console.log(i));
}

myEmitter.emit('event');

A proveďte to.

$ node index.js
0
1
2
3
4
5
6
7
8
9
10
(node:10031) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 event listeners added. Use emitter.setMaxListeners() to increase limit

Zajímavé, Node.js posílá varování na stderr když pro jeden přidáte více než deset posluchačů konkrétní událost do emitoru události. Mít 30 posluchačů, kteří reagují na 30 různých událostí, je však v pořádku. Pokud se chcete ponořit trochu hlouběji, můžete varování najít ve zdrojovém kódu Node.js.

Toto varování vám pomůže zabránit úniku paměti. Procesy Node.js mohou běžet věky, a když máte ve svém kódu chybu a před čištěním vytvoříte nový posluchač událostí, nebo nepoužíváte stávající, využití paměti tímto procesem pomalu poroste a způsobí problémy na vašich serverech. v určitém okamžiku.

Je třeba zdůraznit, že toto je „jen“ varování a proces Node.js bude stále provádět jedenáct přidaných posluchačů. Neukončí proces, objeví se pouze jednou za událost a jde spíše o poukázání na problémy ve zdrojovém kódu.

Někdy však pro událost na emitoru události potřebujete více než deset posluchačů. Toto je situace, kdy setMaxListeners přichází do hry. Funkce, která je také několikrát použita v samotném projektu Node.js.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
// increase the limit
myEmitter.setMaxListeners(11);

for(let i = 0; i < 11; i++) {
  myEmitter.on('event', _ => console.log(i));
}

myEmitter.emit('event');

Pomocí setMaxListeners tímto způsobem se můžete rychle zbavit varování ohledně počtu posluchačů a pokračovat v kódování. Řekl bych, že toto varování je docela dobrým příkladem dobrých vývojářských zkušeností. 👍🏻