Skip to content

Instantly share code, notes, and snippets.

@tastycode
Created April 10, 2014 19:59
Show Gist options
  • Save tastycode/10417482 to your computer and use it in GitHub Desktop.
Save tastycode/10417482 to your computer and use it in GitHub Desktop.
Deferred Event Queue Patterns
'use strict';
angular.module('rallyApp')
.service('EventQueue', function EventQueue($q) {
var eventQueues = {};
var listeners = {};
var triggerEvent = function(queue, event, listener) {
queue.splice(queue.indexOf(event), 1);
listener.cb(event);
};
var checkListener = function(listener, channelName) {
var queue = eventQueues[channelName];
events.forEach(function(event) {
triggerEvent(queue, event, listener);
});
};
var checkListeners = function() {
Object.keys(listeners).forEach(function(channelName) {
listeners[channelName].forEach(function(listener) {
checkListener(listener, channelName);
});
});
};
var ensureChannel = function(channelName, context) {
if (typeof(context[channelName]) === 'undefined')
context[channelName] = [];
return context[channelName];
};
return {
on: function(channelName, cb) {
var channel = ensureChannel(channelName, listeners);
channel.push({
cb: cb
});
service.checkListeners();
},
queue: function(channelName, data) {
var channel = ensureChannel(channelName, eventQueues);
if (typeof(data) === 'undefined')
data = {};
channel.push(data);
service.checkListeners();
}
};
return service;
});
'use strict';
angular.module('rallyApp')
.service('EventQueue', function EventQueue($rootScope) {
var eventQueues = {};
var ensureChannel = function(channelName, context) {
if (typeof(context[channelName]) === 'undefined')
context[channelName] = [];
return context[channelName];
};
return {
on: function(channelName, cb) {
var events = ensureChannel(channelName, eventQueues);
$rootScope.$on(channelName, function(event, eventData) {
if (events.indexOf(eventData) > 0)
events.splice(events.indexOf(eventData), 1);
cb(event, args);
});
events.forEach(function(eventData) {
$rootScope.$broadcast(channelName, eventData);
});
},
queue: function(channelName, data) {
if (typeof(data) === 'undefined')
data = {};
$rootScope.$broadcast(channelName, data);
var channel = ensureChannel(channelName, eventQueues);
channel.push(data);
}
};
return service;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment