Skip to content

Instantly share code, notes, and snippets.

@a-laughlin
Created December 2, 2011 06:28
Show Gist options
  • Save a-laughlin/1422063 to your computer and use it in GitHub Desktop.
Save a-laughlin/1422063 to your computer and use it in GitHub Desktop.
Multi-dependency pubsub with jQuery.Callbacks() and jQuery.Deferreds()
/*!
* jQuery multi-dependency pubsub v0.01
* Copyright 2011, Adam Laughlin
* http://a-laughlin.com
* Licensed under MIT & GPL version 2
* http://static.a-laughlin.com/mit_license.txt
* http://static.a-laughlin.com/gpl_license.txt
*
* inspired by Addy Osmani's example at:
* http://addyosmani.com/blog/jquery-1-7s-callbacks-feature-demystified/
*/
/*
(function($){
jQuery.pubsub=(function(){
var callbacks={}; // holds the pubsub objects
function CbObj(cbName){ // constructor for the pubsub objects
return $.extend($.Callbacks('unique memory'),$.Deferred(),{callbackName:cbName})
};
return function(namesStr){
if(typeof namesStr!='string') throw 'pubsub only accepts strings';
var namesArray = namesStr.split(' '),
cbsArray= $.map(namesArray,function(name){
return callbacks[name] = callbacks[name]|| CbObj(name);
});
function publish(msg){ // wrapper for both $.Callbacks().fire() and $.Deferred().resolve();
return $.each(cbsArray,function(cbnum,cb){
cb.fire(msg);
cb.resolve(msg);
});
};
function subscribe(){ // wrapper as $.Callbacks().add()
var fns=arguments;
return $.each(cbsArray,function(cbnum,cb){
cb.add.apply(cb,fns);
});
};
function fail(){ // wrapper for $.Deferred().fail()
var fns=arguments;
$.when.apply(null,cbsArray)
.fail.apply(null,fns);
return cbsArray;
};
function done(){ // wrapper for $.Deferred().done()
var fns=arguments;
$.when.apply(null,cbsArray)
.done.apply(null,fns);
return cbsArray;
};
function unsubscribe(){ // wrapper for $.Callbacks().remove(). Also resets deferred if resolved.
var fns=arguments;
return $.each(cbsArray,function(cbnum,cb){
cb.remove.apply(cb,fns);
if (cb.state()==='resolved') $.extend(cb,$.Deferred());
});
};
function empty(){
return $.each(cbsArray,function(cbnum,cb){ // wrapper for $.Callbacks().empty(). Also resets deferred if resolved.
cb.empty();
if (cb.state()==='resolved') $.extend(cb,$.Deferred());
});
};
function reset(){ // reset each pubsub object to its original state
return $.each(cbsArray,function(cbnum,cb){
callbacks[cb.callbackName] = new CbObj(cb.callbackName);
});
};
return {publish:publish,subscribe:subscribe,unsubscribe:unsubscribe,empty:empty,done:done,reset:reset};
}
})();
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment