events: add eventNames() method
Per https://github.com/nodejs/node/issues/1817, there are many modules that currently abuse the private `_events` property on EventEmitter. One of the ways it is used is to determine if a particular event is being listened for. This adds a simple `eventNames()` method that returns an array of the events with currently registered listeners. PR-URL: https://github.com/nodejs/node/pull/5617 Reviewed-By: Brian White <mscdex@mscdex.net> Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com> Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
This commit is contained in:
parent
f380db237b
commit
b6e3fa745b
@ -295,6 +295,24 @@ they were registered, passing the supplied arguments to each.
|
|||||||
|
|
||||||
Returns `true` if event had listeners, `false` otherwise.
|
Returns `true` if event had listeners, `false` otherwise.
|
||||||
|
|
||||||
|
### emitter.eventNames()
|
||||||
|
|
||||||
|
Returns an array listing the events for which the emitter has registered
|
||||||
|
listeners. The values in the array will be strings or Symbols.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const EventEmitter = require('events');
|
||||||
|
const myEE = new EventEmitter();
|
||||||
|
myEE.on('foo', () => {});
|
||||||
|
myEE.on('bar', () => {});
|
||||||
|
|
||||||
|
const sym = Symbol('symbol');
|
||||||
|
myEE.on(sym, () => {});
|
||||||
|
|
||||||
|
console.log(myErr.eventNames());
|
||||||
|
// Prints ['foo', 'bar', Symbol('symbol')]
|
||||||
|
```
|
||||||
|
|
||||||
### emitter.getMaxListeners()
|
### emitter.getMaxListeners()
|
||||||
|
|
||||||
Returns the current max listener value for the `EventEmitter` which is either
|
Returns the current max listener value for the `EventEmitter` which is either
|
||||||
|
@ -436,6 +436,15 @@ function listenerCount(type) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventEmitter.prototype.eventNames = function eventNames() {
|
||||||
|
if (this._eventsCount > 0) {
|
||||||
|
const events = this._events;
|
||||||
|
return Object.keys(events).concat(
|
||||||
|
Object.getOwnPropertySymbols(events));
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
// About 1.5x faster than the two-arg version of Array#splice().
|
// About 1.5x faster than the two-arg version of Array#splice().
|
||||||
function spliceOne(list, index) {
|
function spliceOne(list, index) {
|
||||||
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
|
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
|
||||||
|
19
test/parallel/test-events-list.js
Normal file
19
test/parallel/test-events-list.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
require('../common');
|
||||||
|
const EventEmitter = require('events');
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
const EE = new EventEmitter();
|
||||||
|
const m = () => {};
|
||||||
|
EE.on('foo', () => {});
|
||||||
|
assert.deepStrictEqual(['foo'], EE.eventNames());
|
||||||
|
EE.on('bar', m);
|
||||||
|
assert.deepStrictEqual(['foo', 'bar'], EE.eventNames());
|
||||||
|
EE.removeListener('bar', m);
|
||||||
|
assert.deepStrictEqual(['foo'], EE.eventNames());
|
||||||
|
const s = Symbol('s');
|
||||||
|
EE.on(s, m);
|
||||||
|
assert.deepStrictEqual(['foo', s], EE.eventNames());
|
||||||
|
EE.removeListener(s, m);
|
||||||
|
assert.deepStrictEqual(['foo'], EE.eventNames());
|
Loading…
x
Reference in New Issue
Block a user