diff --git a/emitter.js b/emitter.js index c17c92f..d9c28cf 100644 --- a/emitter.js +++ b/emitter.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализованы методы several и through */ -getEmitter.isStar = true; +getEmitter.isStar = false; module.exports = getEmitter; /** @@ -13,32 +13,101 @@ module.exports = getEmitter; */ function getEmitter() { return { + events: {}, /** * Подписаться на событие * @param {String} event * @param {Object} context * @param {Function} handler + * @returns {Object} */ on: function (event, context, handler) { - console.info(event, context, handler); + if (event in this.events) { + this.events[event].info.push({ + context: context, + handler: handler + }); + } else { + this.events[event] = { + info: [{ + context: context, + handler: handler + }], + _runHandler: function (infoItem) { + infoItem.handler.call(infoItem.context); + }, + off: function (cont) { + this.info = this.info.filter(function (infoItem) { + + return (infoItem.context !== cont); + }); + }, + emit: function () { + this.info.forEach(function (infoItem) { + this._runHandler(infoItem); + }, this); + } + }; + } + + return this; + }, + + /** + * Должно ли запускаться name1 после name2 + * @param {String} name1 + * @param {String} name2 + * @returns {Boolean} + */ + _isSubName: function (name1, name2) { + + return (name1 === name2) || (name2.indexOf(name1 + '.') === 0); }, /** * Отписаться от события * @param {String} event * @param {Object} context + * @returns {Object} */ + off: function (event, context) { - console.info(event, context); + for (var key in this.events) { + if (this._isSubName(event, key)) { + this.events[key].off(context); + } + } + + return this; + }, + + /** + * Удалить из строки все правее последней звездочки включительно + * @param {String} str + * @returns {String} + */ + _deleteLastDot: function (str) { + var indexLastDot = str.lastIndexOf('.'); + + return str.substring(0, indexLastDot); }, /** * Уведомить о событии * @param {String} event + * @returns {Object} */ emit: function (event) { - console.info(event); + var currentEvent = event; + while (currentEvent !== '') { + if (currentEvent in this.events) { + this.events[currentEvent].emit(); + } + currentEvent = this._deleteLastDot(currentEvent); + } + + return this; }, /** @@ -66,3 +135,4 @@ function getEmitter() { } }; } +

AltStyle によって変換されたページ (->オリジナル) /