http://www.mediawiki.org/wiki/Special:Code/MediaWiki/89913

Revision: 89913
Author:   neilk
Date:     2011-06-12 05:13:59 +0000 (Sun, 12 Jun 2011)
Log Message:
-----------
readiness events, that can occur only once, and can be subscribed to even if 
already occured

Modified Paths:
--------------
    trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js

Modified: trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js
===================================================================
--- trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js     
2011-06-12 02:58:13 UTC (rev 89912)
+++ trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js     
2011-06-12 05:13:59 UTC (rev 89913)
@@ -2,6 +2,9 @@
  * Minimal pubsub framework
  * 
  * Loosely based on 
https://github.com/phiggins42/bloody-jquery-plugins/pubsub.js, which is itself 
BSD-licensed.
+ * Concept of 'ready' events is new, though.
+ *
+ * @author Neil Kandalgaonkar <ne...@wikimedia.org>
  */
 
 ( function( $ ) { 
@@ -9,6 +12,11 @@
         * Store of events -> array of listener callbacks
         */
        var subs = {};
+       
+       /**
+        * Store of ready events, as object of event name -> argument array
+        */
+       var ready = {};
 
        /**
         * Publish an event 
@@ -18,27 +26,60 @@
         */
        $.publish = function( name /* , args... */ ) { 
                var args = [].slice.call( arguments, 1 );
-               $.each( subs[name], function( i, sub ) { 
-                       sub.apply( null, args );
-               } );
-               return subs[name].length;
+               if ( typeof subs[name] !== 'undefined' && subs[name] instanceof 
Array ) { 
+                       $.each( subs[name], function( i, sub ) { 
+                               sub.apply( null, args );
+                       } );
+                       return subs[name].length;
+               }
+               return 0;
        };
 
        /**
+        * Publish a ready event. Ready events occur once only, so
+        * subscribers will be called even if they subscribe later.
+        * Additional variadic arguments after the event name are passed as 
arguments to the subscriber functions
+        * @param {String} name of event
+        * @return {Number} number of subscribers 
+        */
+       $.publishReady = function( name /*, args... */ ) {
+               if ( typeof ready[name] === 'undefined' ) {
+                       var args = [].slice.call( arguments, 1 );
+                       ready[name] = args;
+                       $.publish.apply( null, arguments ); 
+               }
+       };
+
+       /**
         * Subscribe to an event.
         * @param {String} name of event to listen for
         * @param {Function} callback to run when event occurs
         * @return {Array} returns handle which can be used as argument to 
unsubscribe()
         */
        $.subscribe = function( name, fn ) { 
-               if (!subs[name]) { 
+               if ( typeof subs[name] === 'undefined' ) { 
                        subs[name] = []; 
                } 
-               subs[name].push(fn);
+               subs[name].push( fn );
                return [ name, fn ];
        };
 
        /**
+        * Subscribe to a ready event. See publishReady().
+        * Subscribers will be called even if they subscribe long after the 
event fired.
+        * @param {String} name of event to listen for
+        * @param {Function} callback to run now (if event already occurred) or 
when event occurs
+        * @return {Array} returns handle which can be used as argument to 
unsubscribe()
+        */
+       $.subscribeReady = function( name, fn ) {
+               if ( ready[name] ) {
+                       fn.apply( null, ready[name] );
+               } else {
+                       $.subscribe( name, fn );
+               }
+       };
+
+       /**
         * Given the handle of a particular subscription, remove it
         * @param {Array} object returned by subscribe ( array of event name 
and callback )
         * @return {Boolean} success


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to