Add EventEmitter.prototype.once
authorPeteris Krumins <peteris.krumins@gmail.com>
Tue, 12 Oct 2010 20:52:26 +0000 (23:52 +0300)
committerRyan Dahl <ry@tinyclouds.org>
Sun, 17 Oct 2010 03:43:09 +0000 (20:43 -0700)
lib/events.js
test/simple/test-event-emitter-once.js [new file with mode: 0644]

index e0480b0..cf9651a 100644 (file)
@@ -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 (file)
index 0000000..8639231
--- /dev/null
@@ -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);
+});
+