Poniżej przykład implementacji Obserwatora w ES6.
class SimpleEventer { constructor() { this.simpleEventerListeners = {}; } on(type, listener) { if (typeof this.simpleEventerListeners[type] === 'undefined') { this.simpleEventerListeners[type] = []; } this.simpleEventerListeners[type].push(listener); } fire(type, target = this) { let event = {}, listeners; if (typeof type === 'string') { event = {type: type}; } else { throw new Error('Wrong event type name.'); } if (!event.target) { event.target = target; } listeners = this.simpleEventerListeners[event.type]; if (listeners instanceof Array) { for (let i = 0, len = listeners.length; i < len; i++) { listeners[i].call(this, event); } } } off(type, listener) { let simpleEventerListeners = this.simpleEventerListeners[type]; if (simpleEventerListeners instanceof Array) { for (let i = 0, len = simpleEventerListeners.length; i < len; i++) { if (simpleEventerListeners[i] === listener) { simpleEventerListeners.splice(i, 1); break; } } } } }
class ComponentPopup { constructor() { } showPopup(text) { console.log(text); } }
import SimpleEventer from 'simple-eventer'; export default class ComponentTimeout extends SimpleEventer { constructor() { super(); this.initTimeout(); } initTimeout() { setTimeout(() => { this.fire('afterTimeout'); }, 2000); } }
import ComponentPopup from '../components/componentPopup'; import ComponentTimeout from '../components/componentTimeout'; export class Mediator { constructor() { this.componentPopup = new ComponentPopup(); this.componentTimeout = new ComponentTimeout(); this.functionality1(); } functionality1() { this.componentTimeout.on('afterTimeout', () => { this.componentPopup.showPopup('po timeoutce'); // po timeoutce }); } }
import Mediator from './patterns/observer'; function init() { let mediator = new Mediator(); } $(document).ready(init);