From 9c56756d61c815e750d331621509fdb0b4cbaad9 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 21:48:57 +0500 Subject: [PATCH 01/23] initial --- emitter.js | 66 ++++++++++++++++++++++++++ index.html | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 index.html diff --git a/emitter.js b/emitter.js index c17c92f..f2de7ee 100644 --- a/emitter.js +++ b/emitter.js @@ -7,38 +7,102 @@ getEmitter.isStar = true; module.exports = getEmitter; +function EventTarget(target) { + target.callbacks = target.callbacks || {}; + target.on = function(event, fn) { + target.callbacks[event] = target.callbacks[event] || []; + target.callbacks[event].push(fn); + }; + target.off = function(event) { + target.callbacks[event] = []; + }; + target.dispatch = function(event) { + target.callbacks[event].reverse(); + target.callbacks[event].forEach(function (fn) { + fn.apply(target, arguments); + }); + target.callbacks[event].reverse(); + }; + + return target; +} +function getAllNamespacedEvents(event) { + var namespaces = event.split('.'); + var events = []; + namespaces.forEach(function () { + events.push(event); + var lastDotIdx = event.lastIndexOf('.'); + if (lastDotIdx === -1) { + return; + } + event = event.slice(0, lastDotIdx); + }); + + return events; +} + /** * Возвращает новый emitter * @returns {Object} */ function getEmitter() { return { + observers: {}, /** * Подписаться на событие * @param {String} event * @param {Object} context * @param {Function} handler + * @returns {Emitter} */ on: function (event, context, handler) { console.info(event, context, handler); + context = new EventTarget(context); + context.on(event, handler); + this.observers[event] = this.observers[event] || []; + this.observers[event].push(context); + + return this; }, /** * Отписаться от события * @param {String} event * @param {Object} context + * @returns {Emitter} */ off: function (event, context) { console.info(event, context); + context = new EventTarget(context); + var targetIdx = this.observers[event].indexOf(context); + this.observers[event].splice(targetIdx, 1); + context.off(event); + + return this; }, /** * Уведомить о событии * @param {String} event + * @returns {Emitter} */ emit: function (event) { console.info(event); + var allEvents = getAllNamespacedEvents(event); + var self = this; + allEvents.forEach(function (event) { + if (typeof self.observers[event] === 'undefined') { + return; + } + self.observers[event].reverse(); + self.observers[event].forEach(function (target) { + target.dispatch(event); + }); + self.observers[event].reverse(); + }); + + return this; }, /** @@ -48,6 +112,7 @@ function getEmitter() { * @param {Object} context * @param {Function} handler * @param {Number} times – сколько раз получить уведомление + * @returns {Emitter} */ several: function (event, context, handler, times) { console.info(event, context, handler, times); @@ -60,6 +125,7 @@ function getEmitter() { * @param {Object} context * @param {Function} handler * @param {Number} frequency – как часто уведомлять + * @returns {Emitter} */ through: function (event, context, handler, frequency) { console.info(event, context, handler, frequency); diff --git a/index.html b/index.html new file mode 100644 index 0000000..8001eb5 --- /dev/null +++ b/index.html @@ -0,0 +1,135 @@ + + + + + + + \ No newline at end of file From 7f2343ca7762d2540071ed445acc164896d368d1 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 21:53:13 +0500 Subject: [PATCH 02/23] lint --- emitter.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/emitter.js b/emitter.js index f2de7ee..77a3248 100644 --- a/emitter.js +++ b/emitter.js @@ -9,14 +9,14 @@ module.exports = getEmitter; function EventTarget(target) { target.callbacks = target.callbacks || {}; - target.on = function(event, fn) { + target.on = function (event, fn) { target.callbacks[event] = target.callbacks[event] || []; target.callbacks[event].push(fn); }; - target.off = function(event) { + target.off = function (event) { target.callbacks[event] = []; }; - target.dispatch = function(event) { + target.dispatch = function (event) { target.callbacks[event].reverse(); target.callbacks[event].forEach(function (fn) { fn.apply(target, arguments); @@ -91,15 +91,15 @@ function getEmitter() { console.info(event); var allEvents = getAllNamespacedEvents(event); var self = this; - allEvents.forEach(function (event) { - if (typeof self.observers[event] === 'undefined') { + allEvents.forEach(function (eventWithoutNamespace) { + if (typeof self.observers[eventWithoutNamespace] === 'undefined') { return; } - self.observers[event].reverse(); - self.observers[event].forEach(function (target) { - target.dispatch(event); + self.observers[eventWithoutNamespace].reverse(); + self.observers[eventWithoutNamespace].forEach(function (target) { + target.dispatch(eventWithoutNamespace); }); - self.observers[event].reverse(); + self.observers[eventWithoutNamespace].reverse(); }); return this; @@ -112,7 +112,6 @@ function getEmitter() { * @param {Object} context * @param {Function} handler * @param {Number} times – сколько раз получить уведомление - * @returns {Emitter} */ several: function (event, context, handler, times) { console.info(event, context, handler, times); @@ -125,7 +124,6 @@ function getEmitter() { * @param {Object} context * @param {Function} handler * @param {Number} frequency – как часто уведомлять - * @returns {Emitter} */ through: function (event, context, handler, frequency) { console.info(event, context, handler, frequency); From 53630c6c3836a9244dc3830e6a2688303444df8d Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 21:59:41 +0500 Subject: [PATCH 03/23] star --- emitter.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/emitter.js b/emitter.js index 77a3248..6464fdb 100644 --- a/emitter.js +++ b/emitter.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализованы методы several и through */ -getEmitter.isStar = true; +getEmitter.isStar = false; module.exports = getEmitter; function EventTarget(target) { @@ -112,9 +112,10 @@ function getEmitter() { * @param {Object} context * @param {Function} handler * @param {Number} times – сколько раз получить уведомление + * @param {Emitter} */ several: function (event, context, handler, times) { - console.info(event, context, handler, times); + return this; }, /** @@ -124,9 +125,10 @@ function getEmitter() { * @param {Object} context * @param {Function} handler * @param {Number} frequency – как часто уведомлять + * @return {Emitter} */ through: function (event, context, handler, frequency) { - console.info(event, context, handler, frequency); + return this; } }; } From 86016de3e4b174b550bcf96f0e97abc2b031c557 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 22:04:17 +0500 Subject: [PATCH 04/23] lint --- emitter.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/emitter.js b/emitter.js index 6464fdb..d7f57b3 100644 --- a/emitter.js +++ b/emitter.js @@ -108,26 +108,18 @@ function getEmitter() { /** * Подписаться на событие с ограничением по количеству полученных уведомлений * @star - * @param {String} event - * @param {Object} context - * @param {Function} handler - * @param {Number} times – сколько раз получить уведомление - * @param {Emitter} + * @returns {Object} */ - several: function (event, context, handler, times) { + several: function () { return this; }, /** * Подписаться на событие с ограничением по частоте получения уведомлений * @star - * @param {String} event - * @param {Object} context - * @param {Function} handler - * @param {Number} frequency – как часто уведомлять - * @return {Emitter} + * @returns {Object} */ - through: function (event, context, handler, frequency) { + through: function () { return this; } }; From f6debb773f87fdaea14755c1f8eafc9ac6364e24 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 22:05:47 +0500 Subject: [PATCH 05/23] with star --- emitter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emitter.js b/emitter.js index d7f57b3..7a22688 100644 --- a/emitter.js +++ b/emitter.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализованы методы several и through */ -getEmitter.isStar = false; +getEmitter.isStar = true; module.exports = getEmitter; function EventTarget(target) { From c524a6c212de2a71398a9ffebc13c1af91bf3468 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 22:11:01 +0500 Subject: [PATCH 06/23] test --- emitter.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/emitter.js b/emitter.js index 7a22688..7a1d2db 100644 --- a/emitter.js +++ b/emitter.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализованы методы several и through */ -getEmitter.isStar = true; +getEmitter.isStar = false; module.exports = getEmitter; function EventTarget(target) { @@ -14,7 +14,11 @@ function EventTarget(target) { target.callbacks[event].push(fn); }; target.off = function (event) { - target.callbacks[event] = []; + Object.keys(target.callbacks).forEach(function (subscribedEvent) { + if (subscribedEvent.indexOf('.' + event) !== -1) { + target.callbacks[event] = []; + } + }); }; target.dispatch = function (event) { target.callbacks[event].reverse(); From 34d9eade584aaec25808503b5fb2f317b61e7475 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 22:58:14 +0500 Subject: [PATCH 07/23] test --- emitter.js | 10 ++++++++-- index.html | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/emitter.js b/emitter.js index 7a1d2db..891689d 100644 --- a/emitter.js +++ b/emitter.js @@ -15,8 +15,8 @@ function EventTarget(target) { }; target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { - if (subscribedEvent.indexOf('.' + event) !== -1) { - target.callbacks[event] = []; + if (subscribedEvent.indexOf(event) === 0) { + target.callbacks[subscribedEvent] = []; } }); }; @@ -82,6 +82,12 @@ function getEmitter() { var targetIdx = this.observers[event].indexOf(context); this.observers[event].splice(targetIdx, 1); context.off(event); + var self = this; + Object.keys(this.observers).forEach(function (subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0) { + self.observers[subscribedEvent].splice(targetIdx); + } + }); return this; }, diff --git a/index.html b/index.html index 8001eb5..1712694 100644 --- a/index.html +++ b/index.html @@ -16,8 +16,12 @@ target.callbacks[event] = target.callbacks[event] || []; target.callbacks[event].push(fn); }; - target.off = function(event) { - target.callbacks[event] = []; + target.off = function (event) { + Object.keys(target.callbacks).forEach(function (subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0) { + target.callbacks[event] = []; + } + }); }; target.dispatch = function(event) { target.callbacks[event].reverse(); @@ -78,8 +82,16 @@ var targetIdx = this.observers[event].indexOf(context); this.observers[event].splice(targetIdx, 1); context.off(event); + var self = this; + Object.keys(this.observers).forEach(function (subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0) { + self.observers[subscribedEvent].splice(targetIdx); + } + }); + return this; }, + /** * Уведомить о событии From 6bb94de1f7dca33cada841b3bc814dbca5189cef Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:23:31 +0500 Subject: [PATCH 08/23] test --- emitter.js | 7 +++---- index.html | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/emitter.js b/emitter.js index 891689d..4dad6d9 100644 --- a/emitter.js +++ b/emitter.js @@ -79,13 +79,12 @@ function getEmitter() { off: function (event, context) { console.info(event, context); context = new EventTarget(context); - var targetIdx = this.observers[event].indexOf(context); - this.observers[event].splice(targetIdx, 1); context.off(event); var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { - if (subscribedEvent.indexOf(event) === 0) { - self.observers[subscribedEvent].splice(targetIdx); + var targetIdx = this.observers[subscribedEvent].indexOf(context); + if (subscribedEvent.indexOf(event) === 0 && subcribedEven) { + self.observers[subscribedEvent].splice(targetIdx, 1); } }); diff --git a/index.html b/index.html index 1712694..57cac41 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,7 @@ target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { if (subscribedEvent.indexOf(event) === 0) { - target.callbacks[event] = []; + target.callbacks[subscribedEvent] = []; } }); }; From 5eee62a90862e7d8899000caa3ef3e90e5f5a9fb Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:25:00 +0500 Subject: [PATCH 09/23] test --- emitter.js | 2 +- index.html | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/emitter.js b/emitter.js index 4dad6d9..2c779ac 100644 --- a/emitter.js +++ b/emitter.js @@ -82,7 +82,7 @@ function getEmitter() { context.off(event); var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { - var targetIdx = this.observers[subscribedEvent].indexOf(context); + var targetIdx = self.observers[subscribedEvent].indexOf(context); if (subscribedEvent.indexOf(event) === 0 && subcribedEven) { self.observers[subscribedEvent].splice(targetIdx, 1); } diff --git a/index.html b/index.html index 57cac41..bcfcff6 100644 --- a/index.html +++ b/index.html @@ -79,13 +79,12 @@ off: function (event, context) { console.info(event, context); context = new EventTarget(context); - var targetIdx = this.observers[event].indexOf(context); - this.observers[event].splice(targetIdx, 1); context.off(event); var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { - if (subscribedEvent.indexOf(event) === 0) { - self.observers[subscribedEvent].splice(targetIdx); + var targetIdx = this.observers[subscribedEvent].indexOf(context); + if (subscribedEvent.indexOf(event) === 0 && subcribedEven) { + self.observers[subscribedEvent].splice(targetIdx, 1); } }); From 3f06ce219ff9e6b1da66304a0700bced94d7dae5 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:26:32 +0500 Subject: [PATCH 10/23] test --- emitter.js | 2 +- index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/emitter.js b/emitter.js index 2c779ac..35cfe6b 100644 --- a/emitter.js +++ b/emitter.js @@ -83,7 +83,7 @@ function getEmitter() { var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subcribedEven) { + if (subscribedEvent.indexOf(event) === 0 && subcribedEvent) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); diff --git a/index.html b/index.html index bcfcff6..9602d46 100644 --- a/index.html +++ b/index.html @@ -82,7 +82,7 @@ context.off(event); var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { - var targetIdx = this.observers[subscribedEvent].indexOf(context); + var targetIdx = self.observers[subscribedEvent].indexOf(context); if (subscribedEvent.indexOf(event) === 0 && subcribedEven) { self.observers[subscribedEvent].splice(targetIdx, 1); } From d097a3d6f59fe2f68f1ca49de7ab8ee719d8b2ce Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:28:13 +0500 Subject: [PATCH 11/23] test --- emitter.js | 2 +- index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/emitter.js b/emitter.js index 35cfe6b..a96cf37 100644 --- a/emitter.js +++ b/emitter.js @@ -83,7 +83,7 @@ function getEmitter() { var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subcribedEvent) { + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); diff --git a/index.html b/index.html index 9602d46..4bc7400 100644 --- a/index.html +++ b/index.html @@ -83,7 +83,7 @@ var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subcribedEven) { + if (subscribedEvent.indexOf(event) === 0 && subcribedEvent) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); From 6336a58476e25c0fc942676e5f15f2f138546291 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:50:18 +0500 Subject: [PATCH 12/23] attempt --- emitter.js | 4 ++-- index.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/emitter.js b/emitter.js index a96cf37..19168de 100644 --- a/emitter.js +++ b/emitter.js @@ -21,11 +21,11 @@ function EventTarget(target) { }); }; target.dispatch = function (event) { - target.callbacks[event].reverse(); + //target.callbacks[event].reverse(); target.callbacks[event].forEach(function (fn) { fn.apply(target, arguments); }); - target.callbacks[event].reverse(); + //target.callbacks[event].reverse(); }; return target; diff --git a/index.html b/index.html index 4bc7400..b5251a8 100644 --- a/index.html +++ b/index.html @@ -83,7 +83,7 @@ var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subcribedEvent) { + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); From 02041fd49c95aff47d169d3cf0c46558e05145a1 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:52:14 +0500 Subject: [PATCH 13/23] lint --- emitter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emitter.js b/emitter.js index 19168de..d1ace95 100644 --- a/emitter.js +++ b/emitter.js @@ -21,11 +21,11 @@ function EventTarget(target) { }); }; target.dispatch = function (event) { - //target.callbacks[event].reverse(); + // target.callbacks[event].reverse(); target.callbacks[event].forEach(function (fn) { fn.apply(target, arguments); }); - //target.callbacks[event].reverse(); + // target.callbacks[event].reverse(); }; return target; From 38d609ba08670c0153e5a54ff7c1f6f6b24735c6 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:56:10 +0500 Subject: [PATCH 14/23] test --- emitter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/emitter.js b/emitter.js index d1ace95..3bbc3e5 100644 --- a/emitter.js +++ b/emitter.js @@ -65,7 +65,9 @@ function getEmitter() { context = new EventTarget(context); context.on(event, handler); this.observers[event] = this.observers[event] || []; - this.observers[event].push(context); + if (this.observers.indexOf(context) === -1) { + this.observers[event].push(context); + } return this; }, From a9ad24d3fae0858bfcb068f37bf0f7ca0b3019e7 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Wed, 9 Nov 2016 23:58:17 +0500 Subject: [PATCH 15/23] test --- emitter.js | 2 +- index.html | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/emitter.js b/emitter.js index 3bbc3e5..874736f 100644 --- a/emitter.js +++ b/emitter.js @@ -65,7 +65,7 @@ function getEmitter() { context = new EventTarget(context); context.on(event, handler); this.observers[event] = this.observers[event] || []; - if (this.observers.indexOf(context) === -1) { + if (this.observers[event].indexOf(context) === -1) { this.observers[event].push(context); } diff --git a/index.html b/index.html index b5251a8..2aae102 100644 --- a/index.html +++ b/index.html @@ -25,10 +25,10 @@ }; target.dispatch = function(event) { target.callbacks[event].reverse(); - target.callbacks[event].forEach(function (fn) { + //target.callbacks[event].forEach(function (fn) { fn.apply(target, arguments); }); - target.callbacks[event].reverse(); + //target.callbacks[event].reverse(); }; return target; @@ -67,9 +67,13 @@ context = new EventTarget(context); context.on(event, handler); this.observers[event] = this.observers[event] || []; - this.observers[event].push(context); + if (this.observers.indexOf(context) === -1) { + this.observers[event].push(context); + } + return this; }, + /** * Отписаться от события From b45a80868a1098eadfc98d771c4be7a09631f9e9 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 00:08:14 +0500 Subject: [PATCH 16/23] test --- emitter.js | 4 ++-- index.html | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/emitter.js b/emitter.js index 874736f..54cf658 100644 --- a/emitter.js +++ b/emitter.js @@ -106,11 +106,11 @@ function getEmitter() { if (typeof self.observers[eventWithoutNamespace] === 'undefined') { return; } - self.observers[eventWithoutNamespace].reverse(); + //self.observers[eventWithoutNamespace].reverse(); self.observers[eventWithoutNamespace].forEach(function (target) { target.dispatch(eventWithoutNamespace); }); - self.observers[eventWithoutNamespace].reverse(); + //self.observers[eventWithoutNamespace].reverse(); }); return this; diff --git a/index.html b/index.html index 2aae102..b2425dc 100644 --- a/index.html +++ b/index.html @@ -24,8 +24,8 @@ }); }; target.dispatch = function(event) { - target.callbacks[event].reverse(); - //target.callbacks[event].forEach(function (fn) { + //target.callbacks[event].reverse(); + target.callbacks[event].forEach(function (fn) { fn.apply(target, arguments); }); //target.callbacks[event].reverse(); @@ -67,7 +67,7 @@ context = new EventTarget(context); context.on(event, handler); this.observers[event] = this.observers[event] || []; - if (this.observers.indexOf(context) === -1) { + if (this.observers[event].indexOf(context) === -1) { this.observers[event].push(context); } From d1405c84ccf022de687e32ffe5114769629b7392 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 00:09:15 +0500 Subject: [PATCH 17/23] test --- emitter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emitter.js b/emitter.js index 54cf658..8575a89 100644 --- a/emitter.js +++ b/emitter.js @@ -106,11 +106,11 @@ function getEmitter() { if (typeof self.observers[eventWithoutNamespace] === 'undefined') { return; } - //self.observers[eventWithoutNamespace].reverse(); + // self.observers[eventWithoutNamespace].reverse(); self.observers[eventWithoutNamespace].forEach(function (target) { target.dispatch(eventWithoutNamespace); }); - //self.observers[eventWithoutNamespace].reverse(); + // self.observers[eventWithoutNamespace].reverse(); }); return this; From 170edba19a692913ab18d80c2348695dd98a2ccc Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 00:20:05 +0500 Subject: [PATCH 18/23] test --- emitter.js | 2 +- index.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/emitter.js b/emitter.js index 8575a89..94bb601 100644 --- a/emitter.js +++ b/emitter.js @@ -81,7 +81,6 @@ function getEmitter() { off: function (event, context) { console.info(event, context); context = new EventTarget(context); - context.off(event); var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); @@ -89,6 +88,7 @@ function getEmitter() { self.observers[subscribedEvent].splice(targetIdx, 1); } }); + context.off(event); return this; }, diff --git a/index.html b/index.html index b2425dc..e655b02 100644 --- a/index.html +++ b/index.html @@ -108,11 +108,11 @@ if (typeof self.observers[event] === 'undefined') { return; } - self.observers[event].reverse(); + //self.observers[event].reverse(); self.observers[event].forEach(function (target) { target.dispatch(event); }); - self.observers[event].reverse(); + //self.observers[event].reverse(); }); return this; }, From ce96f0c193a12978f9bbc867717d9cb50dd9d969 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 01:33:13 +0500 Subject: [PATCH 19/23] attempt --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index e655b02..9525190 100644 --- a/index.html +++ b/index.html @@ -83,7 +83,6 @@ off: function (event, context) { console.info(event, context); context = new EventTarget(context); - context.off(event); var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); @@ -91,6 +90,7 @@ self.observers[subscribedEvent].splice(targetIdx, 1); } }); + context.off(event); return this; }, From d3fb2f39d58cad48ca065115aa34fdf1e692dcf1 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 11:33:17 +0500 Subject: [PATCH 20/23] test --- emitter.js | 26 +++++++++++++++++---- index.html | 68 +++++++++++++++++++++++++++++++++++------------------- 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/emitter.js b/emitter.js index 94bb601..15e2419 100644 --- a/emitter.js +++ b/emitter.js @@ -9,9 +9,12 @@ module.exports = getEmitter; function EventTarget(target) { target.callbacks = target.callbacks || {}; - target.on = function (event, fn) { + target.on = function (event, fn, currentIdx) { target.callbacks[event] = target.callbacks[event] || []; - target.callbacks[event].push(fn); + target.callbacks[event].push({ + fn: fn, + idx: currentIdx + }); }; target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { @@ -52,6 +55,7 @@ function getAllNamespacedEvents(event) { function getEmitter() { return { observers: {}, + currentHandlerIdx: 0, /** * Подписаться на событие @@ -63,11 +67,12 @@ function getEmitter() { on: function (event, context, handler) { console.info(event, context, handler); context = new EventTarget(context); - context.on(event, handler); + context.on(event, handler, this.currentHandlerIdx); this.observers[event] = this.observers[event] || []; if (this.observers[event].indexOf(context) === -1) { this.observers[event].push(context); } + this.currentHandlerIdx += 1; return this; }, @@ -107,8 +112,21 @@ function getEmitter() { return; } // self.observers[eventWithoutNamespace].reverse(); + var allHandlers = []; self.observers[eventWithoutNamespace].forEach(function (target) { - target.dispatch(eventWithoutNamespace); + // target.dispatch(eventWithoutNamespace); + target.callbacks[eventWithoutNamespace].forEach(function (targetHandler) { + var handlerWithTarget = Object.assign({ + target: target + }, targetHandler); + allHandlers.push(handlerWithTarget); + }); + }); + allHandlers.sort(function (a, b) { + return a.idx - b.idx; + }); + allHandlers.forEach(function (handler) { + handler.fn.apply(handler.target, arguments); }); // self.observers[eventWithoutNamespace].reverse(); }); diff --git a/index.html b/index.html index 9525190..dd27466 100644 --- a/index.html +++ b/index.html @@ -12,9 +12,12 @@ function EventTarget(target) { target.callbacks = target.callbacks || {}; - target.on = function(event, fn) { + target.on = function (event, fn, currentIdx) { target.callbacks[event] = target.callbacks[event] || []; - target.callbacks[event].push(fn); + target.callbacks[event].push({ + fn: fn, + idx: currentIdx + }); }; target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { @@ -55,24 +58,27 @@ function getEmitter() { return { observers: {}, + currentHandlerIdx: 0, - /** - * Подписаться на событие - * @param {String} event - * @param {Object} context - * @param {Function} handler - */ - on: function (event, context, handler) { - console.info(event, context, handler); - context = new EventTarget(context); - context.on(event, handler); - this.observers[event] = this.observers[event] || []; - if (this.observers[event].indexOf(context) === -1) { - this.observers[event].push(context); - } + /** + * Подписаться на событие + * @param {String} event + * @param {Object} context + * @param {Function} handler + * @returns {Emitter} + */ + on: function (event, context, handler) { + console.info(event, context, handler); + context = new EventTarget(context); + context.on(event, handler, this.currentHandlerIdx); + this.observers[event] = this.observers[event] || []; + if (this.observers[event].indexOf(context) === -1) { + this.observers[event].push(context); + } + this.currentHandlerIdx += 1; - return this; - }, + return this; + }, /** @@ -104,16 +110,30 @@ console.info(event); var allEvents = getAllNamespacedEvents(event); var self = this; - allEvents.forEach(function (event) { - if (typeof self.observers[event] === 'undefined') { + allEvents.forEach(function (eventWithoutNamespace) { + if (typeof self.observers[eventWithoutNamespace] === 'undefined') { return; } - //self.observers[event].reverse(); - self.observers[event].forEach(function (target) { - target.dispatch(event); + // self.observers[eventWithoutNamespace].reverse(); + var allHandlers = []; + self.observers[eventWithoutNamespace].forEach(function (target) { + // target.dispatch(eventWithoutNamespace); + target.callbacks[eventWithoutNamespace].forEach(function (targetHandler) { + var handlerWithTarget = Object.assign({ + target: target + }, targetHandler); + allHandlers.push(handlerWithTarget); + }); }); - //self.observers[event].reverse(); + allHandlers.sort(function (a, b) { + return a.idx - b.idx; + }); + allHandlers.forEach(function (handler) { + handler.fn.apply(handler.target, arguments); + }); + // self.observers[eventWithoutNamespace].reverse(); }); + return this; }, From ee541d07397b075c012eefb0e171dcd7542d2c92 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 11:53:46 +0500 Subject: [PATCH 21/23] off --- emitter.js | 30 ++-------- emitter.old.js | 155 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 24 deletions(-) create mode 100644 emitter.old.js diff --git a/emitter.js b/emitter.js index 15e2419..9c1d8f3 100644 --- a/emitter.js +++ b/emitter.js @@ -9,12 +9,9 @@ module.exports = getEmitter; function EventTarget(target) { target.callbacks = target.callbacks || {}; - target.on = function (event, fn, currentIdx) { + target.on = function (event, fn) { target.callbacks[event] = target.callbacks[event] || []; - target.callbacks[event].push({ - fn: fn, - idx: currentIdx - }); + target.callbacks[event].push(fn); }; target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { @@ -55,7 +52,6 @@ function getAllNamespacedEvents(event) { function getEmitter() { return { observers: {}, - currentHandlerIdx: 0, /** * Подписаться на событие @@ -67,12 +63,11 @@ function getEmitter() { on: function (event, context, handler) { console.info(event, context, handler); context = new EventTarget(context); - context.on(event, handler, this.currentHandlerIdx); + context.on(event, handler); this.observers[event] = this.observers[event] || []; if (this.observers[event].indexOf(context) === -1) { this.observers[event].push(context); } - this.currentHandlerIdx += 1; return this; }, @@ -89,7 +84,7 @@ function getEmitter() { var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent && targetIdx !== -1) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); @@ -112,21 +107,8 @@ function getEmitter() { return; } // self.observers[eventWithoutNamespace].reverse(); - var allHandlers = []; self.observers[eventWithoutNamespace].forEach(function (target) { - // target.dispatch(eventWithoutNamespace); - target.callbacks[eventWithoutNamespace].forEach(function (targetHandler) { - var handlerWithTarget = Object.assign({ - target: target - }, targetHandler); - allHandlers.push(handlerWithTarget); - }); - }); - allHandlers.sort(function (a, b) { - return a.idx - b.idx; - }); - allHandlers.forEach(function (handler) { - handler.fn.apply(handler.target, arguments); + target.dispatch(eventWithoutNamespace); }); // self.observers[eventWithoutNamespace].reverse(); }); @@ -152,4 +134,4 @@ function getEmitter() { return this; } }; -} +} \ No newline at end of file diff --git a/emitter.old.js b/emitter.old.js new file mode 100644 index 0000000..15e2419 --- /dev/null +++ b/emitter.old.js @@ -0,0 +1,155 @@ +'use strict'; + +/** + * Сделано задание на звездочку + * Реализованы методы several и through + */ +getEmitter.isStar = false; +module.exports = getEmitter; + +function EventTarget(target) { + target.callbacks = target.callbacks || {}; + target.on = function (event, fn, currentIdx) { + target.callbacks[event] = target.callbacks[event] || []; + target.callbacks[event].push({ + fn: fn, + idx: currentIdx + }); + }; + target.off = function (event) { + Object.keys(target.callbacks).forEach(function (subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0) { + target.callbacks[subscribedEvent] = []; + } + }); + }; + target.dispatch = function (event) { + // target.callbacks[event].reverse(); + target.callbacks[event].forEach(function (fn) { + fn.apply(target, arguments); + }); + // target.callbacks[event].reverse(); + }; + + return target; +} +function getAllNamespacedEvents(event) { + var namespaces = event.split('.'); + var events = []; + namespaces.forEach(function () { + events.push(event); + var lastDotIdx = event.lastIndexOf('.'); + if (lastDotIdx === -1) { + return; + } + event = event.slice(0, lastDotIdx); + }); + + return events; +} + +/** + * Возвращает новый emitter + * @returns {Object} + */ +function getEmitter() { + return { + observers: {}, + currentHandlerIdx: 0, + + /** + * Подписаться на событие + * @param {String} event + * @param {Object} context + * @param {Function} handler + * @returns {Emitter} + */ + on: function (event, context, handler) { + console.info(event, context, handler); + context = new EventTarget(context); + context.on(event, handler, this.currentHandlerIdx); + this.observers[event] = this.observers[event] || []; + if (this.observers[event].indexOf(context) === -1) { + this.observers[event].push(context); + } + this.currentHandlerIdx += 1; + + return this; + }, + + /** + * Отписаться от события + * @param {String} event + * @param {Object} context + * @returns {Emitter} + */ + off: function (event, context) { + console.info(event, context); + context = new EventTarget(context); + var self = this; + Object.keys(this.observers).forEach(function (subscribedEvent) { + var targetIdx = self.observers[subscribedEvent].indexOf(context); + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { + self.observers[subscribedEvent].splice(targetIdx, 1); + } + }); + context.off(event); + + return this; + }, + + /** + * Уведомить о событии + * @param {String} event + * @returns {Emitter} + */ + emit: function (event) { + console.info(event); + var allEvents = getAllNamespacedEvents(event); + var self = this; + allEvents.forEach(function (eventWithoutNamespace) { + if (typeof self.observers[eventWithoutNamespace] === 'undefined') { + return; + } + // self.observers[eventWithoutNamespace].reverse(); + var allHandlers = []; + self.observers[eventWithoutNamespace].forEach(function (target) { + // target.dispatch(eventWithoutNamespace); + target.callbacks[eventWithoutNamespace].forEach(function (targetHandler) { + var handlerWithTarget = Object.assign({ + target: target + }, targetHandler); + allHandlers.push(handlerWithTarget); + }); + }); + allHandlers.sort(function (a, b) { + return a.idx - b.idx; + }); + allHandlers.forEach(function (handler) { + handler.fn.apply(handler.target, arguments); + }); + // self.observers[eventWithoutNamespace].reverse(); + }); + + return this; + }, + + /** + * Подписаться на событие с ограничением по количеству полученных уведомлений + * @star + * @returns {Object} + */ + several: function () { + return this; + }, + + /** + * Подписаться на событие с ограничением по частоте получения уведомлений + * @star + * @returns {Object} + */ + through: function () { + return this; + } + }; +} From 1036e4e590d444667e4dd8c35ea4d28a8c939148 Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 11:56:54 +0500 Subject: [PATCH 22/23] lint --- emitter.js | 2 +- index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/emitter.js b/emitter.js index 9c1d8f3..da52cf8 100644 --- a/emitter.js +++ b/emitter.js @@ -134,4 +134,4 @@ function getEmitter() { return this; } }; -} \ No newline at end of file +} diff --git a/index.html b/index.html index dd27466..70ec75f 100644 --- a/index.html +++ b/index.html @@ -92,7 +92,7 @@ var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent && targetIdx !== -1) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); From 74c80b93c91b5e4ac688e77167afd5f2202e2f9d Mon Sep 17 00:00:00 2001 From: ilearnf Date: Thu, 10 Nov 2016 12:08:33 +0500 Subject: [PATCH 23/23] test --- emitter.js | 28 +++++++++++++++++++++++----- emitter.old.js | 28 +++++----------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/emitter.js b/emitter.js index da52cf8..15e2419 100644 --- a/emitter.js +++ b/emitter.js @@ -9,9 +9,12 @@ module.exports = getEmitter; function EventTarget(target) { target.callbacks = target.callbacks || {}; - target.on = function (event, fn) { + target.on = function (event, fn, currentIdx) { target.callbacks[event] = target.callbacks[event] || []; - target.callbacks[event].push(fn); + target.callbacks[event].push({ + fn: fn, + idx: currentIdx + }); }; target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { @@ -52,6 +55,7 @@ function getAllNamespacedEvents(event) { function getEmitter() { return { observers: {}, + currentHandlerIdx: 0, /** * Подписаться на событие @@ -63,11 +67,12 @@ function getEmitter() { on: function (event, context, handler) { console.info(event, context, handler); context = new EventTarget(context); - context.on(event, handler); + context.on(event, handler, this.currentHandlerIdx); this.observers[event] = this.observers[event] || []; if (this.observers[event].indexOf(context) === -1) { this.observers[event].push(context); } + this.currentHandlerIdx += 1; return this; }, @@ -84,7 +89,7 @@ function getEmitter() { var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subscribedEvent && targetIdx !== -1) { + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); @@ -107,8 +112,21 @@ function getEmitter() { return; } // self.observers[eventWithoutNamespace].reverse(); + var allHandlers = []; self.observers[eventWithoutNamespace].forEach(function (target) { - target.dispatch(eventWithoutNamespace); + // target.dispatch(eventWithoutNamespace); + target.callbacks[eventWithoutNamespace].forEach(function (targetHandler) { + var handlerWithTarget = Object.assign({ + target: target + }, targetHandler); + allHandlers.push(handlerWithTarget); + }); + }); + allHandlers.sort(function (a, b) { + return a.idx - b.idx; + }); + allHandlers.forEach(function (handler) { + handler.fn.apply(handler.target, arguments); }); // self.observers[eventWithoutNamespace].reverse(); }); diff --git a/emitter.old.js b/emitter.old.js index 15e2419..da52cf8 100644 --- a/emitter.old.js +++ b/emitter.old.js @@ -9,12 +9,9 @@ module.exports = getEmitter; function EventTarget(target) { target.callbacks = target.callbacks || {}; - target.on = function (event, fn, currentIdx) { + target.on = function (event, fn) { target.callbacks[event] = target.callbacks[event] || []; - target.callbacks[event].push({ - fn: fn, - idx: currentIdx - }); + target.callbacks[event].push(fn); }; target.off = function (event) { Object.keys(target.callbacks).forEach(function (subscribedEvent) { @@ -55,7 +52,6 @@ function getAllNamespacedEvents(event) { function getEmitter() { return { observers: {}, - currentHandlerIdx: 0, /** * Подписаться на событие @@ -67,12 +63,11 @@ function getEmitter() { on: function (event, context, handler) { console.info(event, context, handler); context = new EventTarget(context); - context.on(event, handler, this.currentHandlerIdx); + context.on(event, handler); this.observers[event] = this.observers[event] || []; if (this.observers[event].indexOf(context) === -1) { this.observers[event].push(context); } - this.currentHandlerIdx += 1; return this; }, @@ -89,7 +84,7 @@ function getEmitter() { var self = this; Object.keys(this.observers).forEach(function (subscribedEvent) { var targetIdx = self.observers[subscribedEvent].indexOf(context); - if (subscribedEvent.indexOf(event) === 0 && subscribedEvent) { + if (subscribedEvent.indexOf(event) === 0 && subscribedEvent && targetIdx !== -1) { self.observers[subscribedEvent].splice(targetIdx, 1); } }); @@ -112,21 +107,8 @@ function getEmitter() { return; } // self.observers[eventWithoutNamespace].reverse(); - var allHandlers = []; self.observers[eventWithoutNamespace].forEach(function (target) { - // target.dispatch(eventWithoutNamespace); - target.callbacks[eventWithoutNamespace].forEach(function (targetHandler) { - var handlerWithTarget = Object.assign({ - target: target - }, targetHandler); - allHandlers.push(handlerWithTarget); - }); - }); - allHandlers.sort(function (a, b) { - return a.idx - b.idx; - }); - allHandlers.forEach(function (handler) { - handler.fn.apply(handler.target, arguments); + target.dispatch(eventWithoutNamespace); }); // self.observers[eventWithoutNamespace].reverse(); });