Skip to content
Browse files

`newListener` emits correct fn when using `once`

Fixes #2826.
  • Loading branch information...
1 parent d4d45a1 commit db8940dae2b545347b918e141dec6a699750be43 @fent fent committed with koichik
Showing with 12 additions and 4 deletions.
  1. +2 −1 lib/events.js
  2. +10 −3 test/simple/test-event-emitter-add-listeners.js
View
3 lib/events.js
@@ -105,7 +105,8 @@ EventEmitter.prototype.addListener = function(type, listener) {
// To avoid recursion in the case that type == "newListeners"! Before
// adding it to the listeners, first emit "newListeners".
- this.emit('newListener', type, listener);
+ this.emit('newListener', type, typeof listener.listener === 'function' ?
+ listener.listener : listener);
if (!this._events[type]) {
// Optimize the case of one listener. Don't need the extra array object.
View
13 test/simple/test-event-emitter-add-listeners.js
@@ -26,6 +26,7 @@ var events = require('events');
var e = new events.EventEmitter();
var events_new_listener_emited = [];
+var listeners_new_listener_emited = [];
var times_hello_emited = 0;
// sanity check
@@ -34,14 +35,19 @@ assert.equal(e.addListener, e.on);
e.on('newListener', function(event, listener) {
console.log('newListener: ' + event);
events_new_listener_emited.push(event);
+ listeners_new_listener_emited.push(listener);
});
-e.on('hello', function(a, b) {
+function hello(a, b) {
console.log('hello');
times_hello_emited += 1;
assert.equal('a', a);
assert.equal('b', b);
-});
+}
+e.on('hello', hello);
+
+var foo = function() {};
+e.once('foo', foo);
console.log('start');
@@ -54,7 +60,8 @@ f.setMaxListeners(0);
process.on('exit', function() {
- assert.deepEqual(['hello'], events_new_listener_emited);
+ assert.deepEqual(['hello', 'foo'], events_new_listener_emited);
+ assert.deepEqual([hello, foo], listeners_new_listener_emited);
assert.equal(1, times_hello_emited);
});

0 comments on commit db8940d

Please sign in to comment.
Something went wrong with that request. Please try again.