Created
April 10, 2014 19:59
-
-
Save tastycode/10417482 to your computer and use it in GitHub Desktop.
Deferred Event Queue Patterns
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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; | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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