Skip to content

Commit

Permalink
Merge pull request #1 from lloyd/master
Browse files Browse the repository at this point in the history
add ability to register for all messages

This is a very nice pull request for a feature that I have wanted to add myself!  Thanks @lloyd.

r+ - merging.
  • Loading branch information
Shane Tomlinson committed May 3, 2012
2 parents 7094335 + 31a7e31 commit f0a38a2
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
30 changes: 28 additions & 2 deletions src/hub.js
@@ -1,7 +1,8 @@
Hub = (function() {
"use strict";

var listeners = {},
var globalListeners = [],
listeners = {},
currID = 0;

function on(message, callback, context) {
Expand All @@ -17,16 +18,32 @@ Hub = (function() {
return id;
}

function all(callback, context) {
globalListeners.push({
id: currID,
callback: context ? callback.bind(context) : callback
});

return currID++;
}

function fire(message) {
var messageListeners = listeners[message];

if(messageListeners) {
// arguments to specific message listeners don't include the
// message name as the first argument, it's implied
var args = [].slice.call(arguments, 1);

for(var i = 0, listener; listener = messageListeners[i]; ++i) {
listener.callback.apply(null, args);
}
}

for(var j = 0, glistener; glistener = globalListeners[j]; ++j) {
// global listeners get the message name as the first argument
glistener.callback.apply(null, arguments);
}
}

function off(id) {
Expand All @@ -35,21 +52,30 @@ Hub = (function() {
for(var i = 0, listener; listener = messageListeners[i]; ++i) {
if(listener.id === id) {
messageListeners.splice(i, 1);
break;
}
}
}

for(var j = 0, glistener; glistener = globalListeners[j]; ++j) {
if(glistener.id === id) {
globalListeners.splice(j, 1);
break;
}
}
}

function reset() {
listeners = {};
globalListeners = [];
currID = 0;
}

return {
all: all,
on: on,
fire: fire,
reset: reset,
off: off
};
}());

26 changes: 24 additions & 2 deletions test/test.js
Expand Up @@ -43,6 +43,11 @@
asyncTest("different messages", function() {
var firstTriggered = false;
var secondTriggered = false;
var totalMessages = 0;

hub.all(function() {
totalMessages++;
});

hub.on("message1", function() {
equal(secondTriggered, false, "listener for second message has not been triggered");
Expand All @@ -57,22 +62,32 @@

hub.fire("message1");
hub.fire("message2");

equal(totalMessages, 2, ".all() handlers receive all messages");
});

asyncTest("off unregisters listener", function() {
var firstTriggered = false;
var secondTriggered = false;


var id0 = hub.all(function() {
ok(false, "this should never be triggered");
firstTriggered = true;
});

var id1 = hub.on("message", function() {
ok(false, "this should never be triggered");
firstTriggered = false;
secondTriggered = true;
});

var id2 = hub.on("message", function() {
equal(firstTriggered, false, "first listener was not triggered");
equal(secondTriggered, false, "second listener was not triggered");
start();
});


hub.off(id0);
hub.off(id1);
hub.fire("message");
});
Expand All @@ -84,6 +99,13 @@
start();
});

hub.all(function(name, arg1, arg2) {
equal(name, "message", "message name to .all passed correctly");
equal(arg1, "arg1", "first argument to .all passed correctly");
equal(arg2, "arg2", "second argument to .all passed correctly");
start();
});

hub.fire("message", "arg1", "arg2");
});
}());
Expand Down

0 comments on commit f0a38a2

Please sign in to comment.