diff --git a/lib/events.js b/lib/events.js index e0480b0eb4..cf9651abb6 100644 --- a/lib/events.js +++ b/lib/events.js @@ -76,6 +76,14 @@ EventEmitter.prototype.addListener = function (type, listener) { EventEmitter.prototype.on = EventEmitter.prototype.addListener; +EventEmitter.prototype.once = function (type, listener) { + var self = this; + self.on(type, function g () { + self.removeListener(type, g); + listener.apply(this, arguments); + }); +}; + EventEmitter.prototype.removeListener = function (type, listener) { if ('function' !== typeof listener) { throw new Error('removeListener only takes instances of Function'); @@ -112,4 +120,4 @@ EventEmitter.prototype.listeners = function (type) { this._events[type] = [this._events[type]]; } return this._events[type]; -}; \ No newline at end of file +}; diff --git a/test/simple/test-event-emitter-once.js b/test/simple/test-event-emitter-once.js new file mode 100644 index 0000000000..8639231283 --- /dev/null +++ b/test/simple/test-event-emitter-once.js @@ -0,0 +1,20 @@ +common = require("../common"); +assert = common.assert +var events = require('events'); + +var e = new events.EventEmitter(); +var times_hello_emited = 0; + +e.once("hello", function (a, b) { + times_hello_emited++; +}); + +e.emit("hello", "a", "b"); +e.emit("hello", "a", "b"); +e.emit("hello", "a", "b"); +e.emit("hello", "a", "b"); + +process.addListener("exit", function () { + assert.equal(1, times_hello_emited); +}); +