Skip to content

Commit eb50d19

Browse files
committed
events: add listener argument to listenerCount
1 parent 5092346 commit eb50d19

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

doc/api/events.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -646,16 +646,23 @@ 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.listenerCount(eventName)`
649+
### `emitter.listenerCount(eventName, [listener])`
650650

651651
<!-- YAML
652652
added: v3.2.0
653+
changes:
654+
- version: REPLACEME
655+
pr-url: REPLACEME
656+
description: Added the listener argument.
653657
-->
654658

655659
* `eventName` {string|symbol} The name of the event being listened for
660+
* `listener` {Function} The name of the listener
656661
* Returns: {integer}
657662

658663
Returns the number of listeners listening to the event named `eventName`.
664+
If `listener` is provided, it will return `1` if the listener is found
665+
in the list of the listeners of the event, `0` otherwise.
659666

660667
### `emitter.listeners(eventName)`
661668

@@ -2468,7 +2475,7 @@ to the `EventTarget`.
24682475
[`EventTarget` error handling]: #eventtarget-error-handling
24692476
[`Event` Web API]: https://dom.spec.whatwg.org/#event
24702477
[`domain`]: domain.md
2471-
[`emitter.listenerCount()`]: #emitterlistenercounteventname
2478+
[`emitter.listenerCount()`]: #emitterlistenercounteventname-listener
24722479
[`emitter.removeListener()`]: #emitterremovelistenereventname-listener
24732480
[`emitter.setMaxListeners(n)`]: #emittersetmaxlistenersn
24742481
[`event.defaultPrevented`]: #eventdefaultprevented

lib/events.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const {
3333
ErrorCaptureStackTrace,
3434
FunctionPrototypeBind,
3535
FunctionPrototypeCall,
36+
Number,
3637
NumberMAX_SAFE_INTEGER,
3738
ObjectDefineProperty,
3839
ObjectDefineProperties,
@@ -832,17 +833,32 @@ EventEmitter.prototype.listenerCount = listenerCount;
832833
* Returns the number of listeners listening to event name
833834
* specified as `type`.
834835
* @param {string | symbol} type
836+
* @param {Function} listener
835837
* @returns {number}
836838
*/
837-
function listenerCount(type) {
839+
function listenerCount(type, listener) {
838840
const events = this._events;
839841

840842
if (events !== undefined) {
841843
const evlistener = events[type];
842844

843845
if (typeof evlistener === 'function') {
846+
if (listener) {
847+
return Number(listener === evlistener);
848+
}
849+
844850
return 1;
845851
} else if (evlistener !== undefined) {
852+
if (listener) {
853+
for (let i = 0, l = evlistener.length; i < l; i++) {
854+
if (evlistener[i] === listener || evlistener[i].listener === listener) {
855+
return 1;
856+
}
857+
}
858+
859+
return 0;
860+
}
861+
846862
return evlistener.length;
847863
}
848864
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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.listenerCount('event'), 0);
12+
assert.strictEqual(EE.listenerCount('event', handler), 0);
13+
assert.strictEqual(EE.listenerCount('event', anotherHandler), 0);
14+
15+
EE.on('event', handler);
16+
17+
assert.strictEqual(EE.listenerCount('event'), 1);
18+
assert.strictEqual(EE.listenerCount('event', handler), 1);
19+
assert.strictEqual(EE.listenerCount('event', anotherHandler), 0);
20+
21+
EE.once('event', anotherHandler);
22+
23+
assert.strictEqual(EE.listenerCount('event'), 2);
24+
assert.strictEqual(EE.listenerCount('event', handler), 1);
25+
assert.strictEqual(EE.listenerCount('event', anotherHandler), 1);
26+
27+
assert.strictEqual(EE.listenerCount('another-event'), 0);
28+
assert.strictEqual(EE.listenerCount('another-event', handler), 0);
29+
assert.strictEqual(EE.listenerCount('another-event', anotherHandler), 0);
30+
31+
EE.emit('event');
32+
33+
assert.strictEqual(EE.listenerCount('event'), 1);
34+
assert.strictEqual(EE.listenerCount('event', handler), 1);
35+
assert.strictEqual(EE.listenerCount('event', anotherHandler), 0);
36+
37+
EE.emit('event');
38+
39+
assert.strictEqual(EE.listenerCount('event'), 1);
40+
assert.strictEqual(EE.listenerCount('event', handler), 1);
41+
assert.strictEqual(EE.listenerCount('event', anotherHandler), 0);
42+
43+
EE.off('event', handler);
44+
45+
assert.strictEqual(EE.listenerCount('event'), 0);
46+
assert.strictEqual(EE.listenerCount('event', handler), 0);
47+
assert.strictEqual(EE.listenerCount('event', anotherHandler), 0);

0 commit comments

Comments
 (0)