diff --git a/src/Draggable/Emitter/Emitter.js b/src/Draggable/Emitter/Emitter.js index 8eac1b98..4cae70bb 100644 --- a/src/Draggable/Emitter/Emitter.js +++ b/src/Draggable/Emitter/Emitter.js @@ -33,13 +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); - } - } + this.callbacks[type] = this.callbacks[type].filter((cb) => cb !== callback); return this; } diff --git a/src/Draggable/Emitter/tests/Emitter.test.js b/src/Draggable/Emitter/tests/Emitter.test.js index 2441b15e..a7851c00 100644 --- a/src/Draggable/Emitter/tests/Emitter.test.js +++ b/src/Draggable/Emitter/tests/Emitter.test.js @@ -31,9 +31,24 @@ describe('Emitter', () => { describe('#off', () => { it('removes a callback by event type', () => { + const callbacks = [jest.fn(), jest.fn()]; + + emitter.on('event', callbacks[0]); + emitter.on('event2', callbacks[1]); + + expect(emitter.callbacks.event).toContain(callbacks[0]); + expect(emitter.callbacks.event2).toContain(callbacks[1]); + + emitter.off('event', callbacks[0]); + + 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); + emitter.on('event', callback, callback); expect(emitter.callbacks.event).toContain(callback);