react-1

event dispatcher

by Leon Rom

JavaScript

function Reactor() {
    function Event(name) {
        this.name = name;
        this.callbacks = [];
    }
    Event.prototype.registerCallback = function(callback) {
        this.callbacks.push(callback);
    };
    Event.prototype.unregisterCallback = function(callback) {
        var array = this.callbacks,
            index = array.indexOf(callback);
        if (index > -1)
            array.splice(index, 1);
    }
    this.events = {};

    this.registerEvent = function(eventName) {
        var event = new Event(eventName);
        this.events[eventName] = event;
    };
    this.dispatchEvent = function(eventName, eventArgs) {
        var events = this.events
        if (events[eventName]) {
            events[eventName].callbacks.forEach(function(callback) {
                callback(eventArgs);
            });
        } else
            console.error("WARNING: can't dispatch " + '"' + eventName + '"')
    };
    this.addEventListener = function(eventName, callback) {
        this.events[eventName].registerCallback(callback);
    };

    this.removeEventListener = function(eventName, callback) {
        var events = this.events
        if (events[eventName]) {
            events[eventName].unregisterCallback(callback);
            delete events[eventName];
        } else
            console.error("ERROR: can't delete " + '"' + eventName + '"')
    };
}
/*
    demo of creating
*/
var reactor = new Reactor();

reactor.registerEvent('big bang');
reactor.registerEvent('second bang');

/*
    demo of using
*/
log("-- add 2 event's listeners for 'big bang' and 1 for 'second bang'")
var callback1 = function() {
    log('This is big bang listener')
}
reactor.addEventListener('big bang', callback1);

reactor.addEventListener('big bang', function() {
    log('This is another big bang listener')
});

reactor.addEventListener('second bang', function() {
    log('This is second bang!')
});

log("-- dipatch 'big bang' and 'second bang'")
reactor.dispatchEvent('big...