From 274a9690e0f260bec1c462412a8c1d50b1b5551d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: Tue, 8 Nov 2016 22:59:18 +0300 Subject: [PATCH 01/14] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- emitter.js | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/emitter.js b/emitter.js index c17c92f..5e512ae 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,89 @@ 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); + for (var i = 0; i < this.events.length; i++) { + if (this.events[i].name === event) { + this.events[i].info.push({ + context: context, + handler: handler + }); + + return this; + } + } + this.events.push({ + name: event, + info: [{ + context: context, + handler: handler + }] + }); + + return this; + }, + + offFromOneEvent: function (info, context) { + for (var i = 0; i < info.length; i++) { + if (info[i].context === context) { + info.splice(i, 1); + } + } }, /** * Отписаться от события * @param {String} event * @param {Object} context + * @returns {Object} */ off: function (event, context) { - console.info(event, context); + for (var i = 0; i < this.events.length; i++) { + var name = this.events[i].name; + if ((name === event) || (name.indexOf(event + '.') === 0)) { + this.offFromOneEvent(this.events[i].info, context); + } + } + + return this; + }, + + /** + * Уведомить об одном событие + * @param {Object} info + */ + emitForOneEvent: function (info) { + for (var i = 0; i < info.length; i++) { + info[i].handler.call(info[i].context); + } }, /** * Уведомить о событии * @param {String} event + * @returns {Object} */ emit: function (event) { - console.info(event); + var currentEvent = event; + var sortedEvents = this.events.slice(); + sortedEvents = sortedEvents.sort().reverse(); + for (var i = 0; i < sortedEvents.length; i++) { + if (currentEvent.indexOf(sortedEvents[i].name) === 0) { + this.emitForOneEvent(sortedEvents[i].info); + currentEvent = sortedEvents[i].name; + } + } + + return this; }, /** From 33b6433e0974c491521ade717a701f35ed42ba96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: Wed, 9 Nov 2016 00:42:25 +0300 Subject: [PATCH 02/14] Update emitter.js --- emitter.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/emitter.js b/emitter.js index 5e512ae..b617136 100644 --- a/emitter.js +++ b/emitter.js @@ -44,12 +44,15 @@ function getEmitter() { return this; }, - offFromOneEvent: function (info, context) { - for (var i = 0; i < info.length; i++) { - if (info[i].context === context) { - info.splice(i, 1); + offFromOneEvent: function (j, context) { + var savesInfo = []; + for (var i = 0; i < this.events[j].info.length; i++) { + if (this.events[j].info[i].context !== context) { + savesInfo.push(this.events[j].info[i]); } } + this.events[j].info = savesInfo; + }, /** @@ -62,7 +65,7 @@ function getEmitter() { for (var i = 0; i < this.events.length; i++) { var name = this.events[i].name; if ((name === event) || (name.indexOf(event + '.') === 0)) { - this.offFromOneEvent(this.events[i].info, context); + this.offFromOneEvent(i, context); } } From 4e276a9f2e88ef93b6af3cb5baa62b3fcfedfe0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: Wed, 9 Nov 2016 10:16:38 +0300 Subject: [PATCH 03/14] Update emitter.js --- emitter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/emitter.js b/emitter.js index b617136..ff98684 100644 --- a/emitter.js +++ b/emitter.js @@ -92,7 +92,8 @@ function getEmitter() { var sortedEvents = this.events.slice(); sortedEvents = sortedEvents.sort().reverse(); for (var i = 0; i < sortedEvents.length; i++) { - if (currentEvent.indexOf(sortedEvents[i].name) === 0) { + var name = sortedEvents[i].name; + if ((currentEvent === name) || (currentEvent.indexOf(name + '.') === 0)) { this.emitForOneEvent(sortedEvents[i].info); currentEvent = sortedEvents[i].name; } From 62772b0ec0cceb51aa9131cc473d5c6c0f034d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月12日 18:34:43 +0300 Subject: [PATCH 04/14] Update emitter.js --- emitter.js | 67 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/emitter.js b/emitter.js index ff98684..aba47a5 100644 --- a/emitter.js +++ b/emitter.js @@ -23,35 +23,42 @@ function getEmitter() { * @returns {Object} */ on: function (event, context, handler) { - for (var i = 0; i < this.events.length; i++) { - if (this.events[i].name === event) { - this.events[i].info.push({ + var existsEvent = false; + this.events.forEach(function (eventsItem) { + if (eventsItem.name === event) { + eventsItem.info.push({ context: context, handler: handler }); - - return this; + existsEvent = true; } - } - this.events.push({ - name: event, - info: [{ - context: context, - handler: handler - }] }); + if (existsEvent === false) { + this.events.push({ + name: event, + info: [{ + context: context, + handler: handler + }] + }); + } return this; }, - offFromOneEvent: function (j, context) { + /** + * Отписаться от одного события + * @param {Number} indexOfEvent + * @param {Object} context + */ + offFromOneEvent: function (indexOfEvent, context) { var savesInfo = []; - for (var i = 0; i < this.events[j].info.length; i++) { - if (this.events[j].info[i].context !== context) { - savesInfo.push(this.events[j].info[i]); + this.events[indexOfEvent].info.forEach(function (info) { + if (info.context !== context) { + savesInfo.push(info); } - } - this.events[j].info = savesInfo; + }); + this.events[indexOfEvent].info = savesInfo; }, @@ -62,12 +69,12 @@ function getEmitter() { * @returns {Object} */ off: function (event, context) { - for (var i = 0; i < this.events.length; i++) { - var name = this.events[i].name; + this.events.forEach(function (eventsItem, indexOfEvent) { + var name = eventsItem.name; if ((name === event) || (name.indexOf(event + '.') === 0)) { - this.offFromOneEvent(i, context); + this.offFromOneEvent(indexOfEvent, context); } - } + }, this); return this; }, @@ -77,9 +84,9 @@ function getEmitter() { * @param {Object} info */ emitForOneEvent: function (info) { - for (var i = 0; i < info.length; i++) { - info[i].handler.call(info[i].context); - } + info.forEach(function (infoItem) { + infoItem.handler.call(infoItem.context); + }); }, /** @@ -91,13 +98,13 @@ function getEmitter() { var currentEvent = event; var sortedEvents = this.events.slice(); sortedEvents = sortedEvents.sort().reverse(); - for (var i = 0; i < sortedEvents.length; i++) { - var name = sortedEvents[i].name; + sortedEvents.forEach(function (sortedEvent) { + var name = sortedEvent.name; if ((currentEvent === name) || (currentEvent.indexOf(name + '.') === 0)) { - this.emitForOneEvent(sortedEvents[i].info); - currentEvent = sortedEvents[i].name; + this.emitForOneEvent(sortedEvent.info); + currentEvent = sortedEvent.name; } - } + }, this); return this; }, From 979e76369f4e3454c654925d0984d6448d8a9fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月13日 08:48:32 +0300 Subject: [PATCH 05/14] Update emitter.js --- emitter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emitter.js b/emitter.js index aba47a5..60d1686 100644 --- a/emitter.js +++ b/emitter.js @@ -33,7 +33,7 @@ function getEmitter() { existsEvent = true; } }); - if (existsEvent === false) { + if (!existsEvent) { this.events.push({ name: event, info: [{ From bb5c0664566e75162c108253405e0c6806de25ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月14日 19:00:15 +0300 Subject: [PATCH 06/14] Update emitter.js --- emitter.js | 70 +++++++++++++++++++++++------------------------------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/emitter.js b/emitter.js index 60d1686..0b5f5df 100644 --- a/emitter.js +++ b/emitter.js @@ -33,35 +33,33 @@ function getEmitter() { existsEvent = true; } }); - if (!existsEvent) { + if (existsEvent === false) { this.events.push({ name: event, info: [{ context: context, handler: handler - }] + }], + off: function (cont) { + var savesInfo = []; + this.info.forEach(function (infoItem) { + if (infoItem.context !== cont) { + savesInfo.push(infoItem); + } + }); + this.info = savesInfo; + }, + emit: function () { + this.info.forEach(function (infoItem) { + infoItem.handler.call(infoItem.context); + }); + } }); } return this; }, - /** - * Отписаться от одного события - * @param {Number} indexOfEvent - * @param {Object} context - */ - offFromOneEvent: function (indexOfEvent, context) { - var savesInfo = []; - this.events[indexOfEvent].info.forEach(function (info) { - if (info.context !== context) { - savesInfo.push(info); - } - }); - this.events[indexOfEvent].info = savesInfo; - - }, - /** * Отписаться от события * @param {String} event @@ -69,42 +67,34 @@ function getEmitter() { * @returns {Object} */ off: function (event, context) { - this.events.forEach(function (eventsItem, indexOfEvent) { + this.events.forEach(function (eventsItem) { var name = eventsItem.name; if ((name === event) || (name.indexOf(event + '.') === 0)) { - this.offFromOneEvent(indexOfEvent, context); + eventsItem.off(context); } - }, this); + }); return this; }, - /** - * Уведомить об одном событие - * @param {Object} info - */ - emitForOneEvent: function (info) { - info.forEach(function (infoItem) { - infoItem.handler.call(infoItem.context); - }); - }, - /** * Уведомить о событии * @param {String} event * @returns {Object} */ emit: function (event) { - var currentEvent = event; - var sortedEvents = this.events.slice(); - sortedEvents = sortedEvents.sort().reverse(); - sortedEvents.forEach(function (sortedEvent) { - var name = sortedEvent.name; - if ((currentEvent === name) || (currentEvent.indexOf(name + '.') === 0)) { - this.emitForOneEvent(sortedEvent.info); - currentEvent = sortedEvent.name; +// eventsInReverseOrder содержит "подсобытия" события event по возрастанию длины имен + var eventsInOrder = []; + this.events.forEach(function (eventsItem) { + var name = eventsItem.name; + if ((name === event) || (event.indexOf(name + '.') === 0)) { + var indexEvent = eventsItem.name.split('.').length + 1; + eventsInOrder[indexEvent] = eventsItem; } - }, this); + }); + eventsInOrder.reverse().forEach(function (eventsItem) { + eventsItem.emit(); + }); return this; }, From ef4a28527ca1d752e9865b6a616f5e9f9c8bad6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月15日 18:15:38 +0300 Subject: [PATCH 07/14] Update emitter.js --- emitter.js | 87 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/emitter.js b/emitter.js index 0b5f5df..4c7cc90 100644 --- a/emitter.js +++ b/emitter.js @@ -6,6 +6,7 @@ */ getEmitter.isStar = false; module.exports = getEmitter; +var HashMap = require('hashmap'); /** * Возвращает новый emitter @@ -13,7 +14,7 @@ module.exports = getEmitter; */ function getEmitter() { return { - events: [], + events: new HashMap(), /** * Подписаться на событие @@ -23,36 +24,31 @@ function getEmitter() { * @returns {Object} */ on: function (event, context, handler) { - var existsEvent = false; - this.events.forEach(function (eventsItem) { - if (eventsItem.name === event) { - eventsItem.info.push({ - context: context, - handler: handler - }); - existsEvent = true; - } - }); - if (existsEvent === false) { - this.events.push({ + if (this.events.has(event)) { + this.events.get(event).info.push({ + context: context, + handler: handler + }); + } else { + this.events.set(event, { name: event, info: [{ context: context, handler: handler }], + _runHandler: function (infoItem) { + infoItem.handler.call(infoItem.context); + }, off: function (cont) { - var savesInfo = []; - this.info.forEach(function (infoItem) { - if (infoItem.context !== cont) { - savesInfo.push(infoItem); - } + this.info = this.info.filter(function (infoItem) { + + return (infoItem.context !== cont); }); - this.info = savesInfo; }, emit: function () { this.info.forEach(function (infoItem) { - infoItem.handler.call(infoItem.context); - }); + this._runHandler(infoItem); + }, this); } }); } @@ -60,41 +56,58 @@ function getEmitter() { 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) { - this.events.forEach(function (eventsItem) { - var name = eventsItem.name; - if ((name === event) || (name.indexOf(event + '.') === 0)) { - eventsItem.off(context); + this.events.forEach(function (value, key) { + if (this._isSubName(event, key)) { + this.events.get(key).off(context); } - }); + }, this); 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) { -// eventsInReverseOrder содержит "подсобытия" события event по возрастанию длины имен - var eventsInOrder = []; - this.events.forEach(function (eventsItem) { - var name = eventsItem.name; - if ((name === event) || (event.indexOf(name + '.') === 0)) { - var indexEvent = eventsItem.name.split('.').length + 1; - eventsInOrder[indexEvent] = eventsItem; + var currentEvent = event; + while (currentEvent !== '') { + if (this.events.has(currentEvent)) { + this.events.get(currentEvent).emit(); } - }); - eventsInOrder.reverse().forEach(function (eventsItem) { - eventsItem.emit(); - }); + currentEvent = this._deleteLastDot(currentEvent); + } return this; }, From ec6b09be3dcb69d49a46faa1627a52a994733ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月15日 18:26:30 +0300 Subject: [PATCH 08/14] Update emitter.js From 6f8bbbf5bbd2fceb13b381a67dfdb796cff9e849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月15日 19:49:20 +0300 Subject: [PATCH 09/14] Update emitter.js From 9bc3acf7f578708cc58dae4885eff5bc57ac579e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月15日 20:35:31 +0300 Subject: [PATCH 10/14] Update emitter.js From 71d2c10730bf389a056fb84656936657c11fb943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月15日 21:01:31 +0300 Subject: [PATCH 11/14] Update package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c3310f2..c7323c4 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "dependencies": { "eslint": "3.7.0", "eslint-config-hrundel": "latest", + "hashmap": "2.0.6", "mocha": "3.1.0" } } From 9faec25596b37f1d86bc8f508c18a0722b03a84f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月16日 18:30:00 +0300 Subject: [PATCH 12/14] Update emitter.js --- emitter.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/emitter.js b/emitter.js index 4c7cc90..b6c2aed 100644 --- a/emitter.js +++ b/emitter.js @@ -6,7 +6,6 @@ */ getEmitter.isStar = false; module.exports = getEmitter; -var HashMap = require('hashmap'); /** * Возвращает новый emitter @@ -14,7 +13,7 @@ var HashMap = require('hashmap'); */ function getEmitter() { return { - events: new HashMap(), + events: {}, /** * Подписаться на событие @@ -24,14 +23,13 @@ function getEmitter() { * @returns {Object} */ on: function (event, context, handler) { - if (this.events.has(event)) { - this.events.get(event).info.push({ + if (event in this.events) { + this.events[event].info.push({ context: context, handler: handler }); } else { - this.events.set(event, { - name: event, + this.events[event] = { info: [{ context: context, handler: handler @@ -75,9 +73,9 @@ function getEmitter() { */ off: function (event, context) { - this.events.forEach(function (value, key) { + for (key in this.events) { if (this._isSubName(event, key)) { - this.events.get(key).off(context); + this.events[key].off(context); } }, this); @@ -103,8 +101,8 @@ function getEmitter() { emit: function (event) { var currentEvent = event; while (currentEvent !== '') { - if (this.events.has(currentEvent)) { - this.events.get(currentEvent).emit(); + if (currentEvent in this.events) { + this.events[currentEvent].emit(); } currentEvent = this._deleteLastDot(currentEvent); } From 62498e05060a127f7f212c48efdc27b79927a7c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月16日 18:35:53 +0300 Subject: [PATCH 13/14] Update package.json --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index c7323c4..c3310f2 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "dependencies": { "eslint": "3.7.0", "eslint-config-hrundel": "latest", - "hashmap": "2.0.6", "mocha": "3.1.0" } } From c7f6900dc20169c33254f5a550abc940d2c31fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=B7=D0=B0=D1=87=D1=83=D0=BA=20=D0=94=D0=BC?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <434744@rambler.ru> Date: 2016年11月16日 18:36:40 +0300 Subject: [PATCH 14/14] Update emitter.js --- emitter.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/emitter.js b/emitter.js index b6c2aed..d9c28cf 100644 --- a/emitter.js +++ b/emitter.js @@ -48,7 +48,7 @@ function getEmitter() { this._runHandler(infoItem); }, this); } - }); + }; } return this; @@ -73,11 +73,11 @@ function getEmitter() { */ off: function (event, context) { - for (key in this.events) { + for (var key in this.events) { if (this._isSubName(event, key)) { this.events[key].off(context); } - }, this); + } return this; }, @@ -135,3 +135,4 @@ function getEmitter() { } }; } +

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