From 48440ef9106c143c441f60c9c1511e3d5b54ae10 Mon Sep 17 00:00:00 2001 From: Mladen Ilic Date: Tue, 19 Nov 2019 00:54:12 +0100 Subject: [PATCH 1/3] Improve Emitter#off Avoid creating copy of the callbacks array --- src/Draggable/Emitter/Emitter.js | 10 +--------- src/Draggable/Emitter/tests/Emitter.test.js | 13 ++++++++----- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/Draggable/Emitter/Emitter.js b/src/Draggable/Emitter/Emitter.js index 8eac1b98..20f946e2 100644 --- a/src/Draggable/Emitter/Emitter.js +++ b/src/Draggable/Emitter/Emitter.js @@ -33,15 +33,7 @@ export default class Emitter { return null; } - const copy = this.callbacks[type].slice(0); - - for (let i = 0; i < copy.length; i++) { - if (callback === copy[i]) { - this.callbacks[type].splice(i, 1); - } - } - - return this; + this.callbacks[type] = this.callbacks[type].filter(cb => cb !== callback); } /** diff --git a/src/Draggable/Emitter/tests/Emitter.test.js b/src/Draggable/Emitter/tests/Emitter.test.js index 2441b15e..eeb8fc9b 100644 --- a/src/Draggable/Emitter/tests/Emitter.test.js +++ b/src/Draggable/Emitter/tests/Emitter.test.js @@ -31,15 +31,18 @@ describe('Emitter', () => { describe('#off', () => { it('removes a callback by event type', () => { - const callback = jest.fn(); + const callbacks = [jest.fn(), jest.fn()]; - emitter.on('event', callback); + emitter.on('event', callbacks[0]); + emitter.on('event2', callbacks[1]); - expect(emitter.callbacks.event).toContain(callback); + expect(emitter.callbacks.event).toContain(callbacks[0]); + expect(emitter.callbacks.event2).toContain(callbacks[1]); - emitter.off('event', callback); + emitter.off('event', callbacks[0]); - expect(emitter.callbacks.event).not.toContain(callback); + expect(emitter.callbacks.event).not.toContain(callbacks[0]); + expect(emitter.callbacks.event2).toContain(callbacks[1]); }); }); From fe9ce7a685b6fd5d9f19daf88f0be22f43f3f895 Mon Sep 17 00:00:00 2001 From: Mladen Ilic Date: Tue, 19 Nov 2019 01:24:44 +0100 Subject: [PATCH 2/3] Add test case to test removing multiple event listeners --- src/Draggable/Emitter/tests/Emitter.test.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Draggable/Emitter/tests/Emitter.test.js b/src/Draggable/Emitter/tests/Emitter.test.js index eeb8fc9b..a7851c00 100644 --- a/src/Draggable/Emitter/tests/Emitter.test.js +++ b/src/Draggable/Emitter/tests/Emitter.test.js @@ -44,6 +44,18 @@ describe('Emitter', () => { expect(emitter.callbacks.event).not.toContain(callbacks[0]); expect(emitter.callbacks.event2).toContain(callbacks[1]); }); + + it('removes multiple callbacks of event type', () => { + const callback = jest.fn(); + + emitter.on('event', callback, callback); + + expect(emitter.callbacks.event).toContain(callback); + + emitter.off('event', callback); + + expect(emitter.callbacks.event).not.toContain(callback); + }); }); describe('#trigger', () => { From 1ec1790e9d3c945eef110813101d7bd84019a9d8 Mon Sep 17 00:00:00 2001 From: Mladen Ilic Date: Tue, 19 Nov 2019 01:52:36 +0100 Subject: [PATCH 3/3] Fix linter issues --- src/Draggable/Emitter/Emitter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Draggable/Emitter/Emitter.js b/src/Draggable/Emitter/Emitter.js index 20f946e2..4cae70bb 100644 --- a/src/Draggable/Emitter/Emitter.js +++ b/src/Draggable/Emitter/Emitter.js @@ -33,7 +33,9 @@ export default class Emitter { return null; } - this.callbacks[type] = this.callbacks[type].filter(cb => cb !== callback); + this.callbacks[type] = this.callbacks[type].filter((cb) => cb !== callback); + + return this; } /**