123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- "use strict";
- module.metadata = {
- "stability": "deprecated"
- };
- const ERROR_TYPE = 'error',
- UNCAUGHT_ERROR = 'An error event was dispatched for which there was'
- + ' no listener.',
- BAD_LISTENER = 'The event listener must be a function.';
- const eventEmitter = {
-
- on: function on(type, listener) {
- if ('function' !== typeof listener)
- throw new Error(BAD_LISTENER);
- let listeners = this._listeners(type);
- if (0 > listeners.indexOf(listener))
- listeners.push(listener);
-
-
- return this._public || this;
- },
-
- once: function once(type, listener) {
- this.on(type, function selfRemovableListener() {
- this.removeListener(type, selfRemovableListener);
- listener.apply(this, arguments);
- });
- },
-
- removeListener: function removeListener(type, listener) {
- if ('function' !== typeof listener)
- throw new Error(BAD_LISTENER);
- let listeners = this._listeners(type),
- index = listeners.indexOf(listener);
- if (0 <= index)
- listeners.splice(index, 1);
-
-
- return this._public || this;
- },
-
- _events: null,
-
- _listeners: function listeners(type) {
- let events = this._events || (this._events = {});
- return (events.hasOwnProperty(type) && events[type]) || (events[type] = []);
- },
-
- _emit: function _emit(type, event) {
- let args = Array.slice(arguments);
-
-
- args.unshift(this._public || this);
- return this._emitOnObject.apply(this, args);
- },
-
- _emitOnObject: function _emitOnObject(targetObj, type, event /* , ... */) {
- let listeners = this._listeners(type).slice(0);
-
- if (type === ERROR_TYPE && !listeners.length)
- console.exception(event);
- if (!listeners.length)
- return false;
- let params = Array.slice(arguments, 2);
- for each (let listener in listeners) {
- try {
- listener.apply(targetObj, params);
- } catch(e) {
-
-
- if (type !== ERROR_TYPE)
- this._emit(ERROR_TYPE, e);
- else
- console.exception("Exception in error event listener " + e);
- }
- }
- return true;
- },
-
- _removeAllListeners: function _removeAllListeners(type) {
- if (typeof type == "undefined") {
- this._events = null;
- return this;
- }
- this._listeners(type).splice(0);
- return this;
- }
- };
- exports.EventEmitter = require("./traits").Trait.compose(eventEmitter);
- exports.EventEmitterTrait = require('./light-traits').Trait(eventEmitter);
|