From f55412035d2f48f0c9c59aabc160473993beb39d Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Fri, 7 Sep 2018 10:14:31 +0800 Subject: [PATCH] Add event emitter --- resources/assets/src/js/event.js | 22 ++++++++++++++++++++++ resources/assets/src/js/index.js | 1 + resources/assets/tests/js/event.test.js | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 resources/assets/src/js/event.js create mode 100644 resources/assets/tests/js/event.test.js diff --git a/resources/assets/src/js/event.js b/resources/assets/src/js/event.js new file mode 100644 index 00000000..cd81a27a --- /dev/null +++ b/resources/assets/src/js/event.js @@ -0,0 +1,22 @@ +/** @type {{ [name: string]: Function[] }} */ +const bus = Object.create(null); + +/** + * @param {string} eventName + * @param {Function} listener + */ +export function on(eventName, listener) { + (bus[eventName] || (bus[eventName] = [])).push(listener); +} + +/** + * @param {string} eventName + * @param {any} payload + */ +export function emit(eventName, payload) { + bus[eventName] && bus[eventName].forEach(listener => listener(payload)); +} + +Object.defineProperty(window, 'bsEmitter', { + get: () => Object.freeze({ on, emit }) +}); diff --git a/resources/assets/src/js/index.js b/resources/assets/src/js/index.js index 4a7aa73d..cc84f188 100644 --- a/resources/assets/src/js/index.js +++ b/resources/assets/src/js/index.js @@ -1,6 +1,7 @@ import './public-path'; // Must be first import './i18n'; import './net'; +import './event'; import './layout'; import './logout'; import './check-updates'; diff --git a/resources/assets/tests/js/event.test.js b/resources/assets/tests/js/event.test.js new file mode 100644 index 00000000..05fdeec9 --- /dev/null +++ b/resources/assets/tests/js/event.test.js @@ -0,0 +1,18 @@ +import * as emitter from '@/js/event'; + +test('mount variable to global', () => { + expect(window.bsEmitter).toBeFrozen(); +}); + +test('add listener and emit event', () => { + const mockA = jest.fn(); + const mockB = jest.fn(); + + emitter.on('a', mockA); + emitter.on('b', mockB); + + emitter.emit('a'); + + expect(mockA).toHaveBeenCalledTimes(1); + expect(mockB).not.toBeCalled(); +});