Skip to content

Commit 3594b21

Browse files
committed
events: add hasListener method
1 parent 5092346 commit 3594b21

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

doc/api/events.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,18 @@ Returns the current max listener value for the `EventEmitter` which is either
646646
set by [`emitter.setMaxListeners(n)`][] or defaults to
647647
[`events.defaultMaxListeners`][].
648648

649+
### `emitter.hasListener(eventName, listener)`
650+
651+
<!-- YAML
652+
added: REPLACEME
653+
-->
654+
655+
* `eventName` {string|symbol} The name of the event being checked
656+
* `listener` {Function} The listener to check
657+
658+
Returns `true` if the listener is already register for the event,
659+
`false` otherwise.
660+
649661
### `emitter.listenerCount(eventName)`
650662

651663
<!-- YAML

lib/events.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,31 @@ function listenerCount(type) {
850850
return 0;
851851
}
852852

853+
/**
854+
* Returns true if the function is register as listener for the event
855+
*
856+
* @param {string | symbol} type
857+
* @param {Function} listener
858+
* @returns {boolean}
859+
*/
860+
EventEmitter.prototype.hasListener = function hasListener(type, listener) {
861+
const list = this._events?.[type];
862+
863+
if (list === undefined) {
864+
return false;
865+
} else if (list === listener || list.listener === listener) {
866+
return true;
867+
} else if (typeof list !== 'function') {
868+
for (let i = 0, l = list.length; i < l; i++) {
869+
if (list[i] === listener || list[i].listener === listener) {
870+
return true;
871+
}
872+
}
873+
}
874+
875+
return false;
876+
};
877+
853878
/**
854879
* Returns an array listing the events for which
855880
* the emitter has registered listeners.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const EventEmitter = require('events');
5+
const assert = require('assert');
6+
7+
const EE = new EventEmitter();
8+
const handler = common.mustCall(undefined, 2);
9+
const anotherHandler = common.mustCall();
10+
11+
assert.strictEqual(EE.hasListener('event', handler), false);
12+
assert.strictEqual(EE.hasListener('event', anotherHandler), false);
13+
14+
EE.on('event', handler);
15+
16+
assert.strictEqual(EE.hasListener('event', handler), true);
17+
assert.strictEqual(EE.hasListener('event', anotherHandler), false);
18+
19+
EE.once('event', anotherHandler);
20+
21+
assert.strictEqual(EE.hasListener('event', handler), true);
22+
assert.strictEqual(EE.hasListener('event', anotherHandler), true);
23+
24+
assert.strictEqual(EE.hasListener('another-event', handler), false);
25+
assert.strictEqual(EE.hasListener('another-event', anotherHandler), false);
26+
27+
EE.emit('event');
28+
29+
assert.strictEqual(EE.hasListener('event', handler), true);
30+
assert.strictEqual(EE.hasListener('event', anotherHandler), false);
31+
32+
EE.emit('event');
33+
34+
assert.strictEqual(EE.hasListener('event', handler), true);
35+
assert.strictEqual(EE.hasListener('event', anotherHandler), false);
36+
37+
EE.off('event', handler);
38+
39+
assert.strictEqual(EE.hasListener('event', handler), false);
40+
assert.strictEqual(EE.hasListener('event', anotherHandler), false);

0 commit comments

Comments
 (0)