jenkins-bot has submitted this change and it was merged.

Change subject: mediawiki.user: Return a promise from getRights/getGroups
......................................................................


mediawiki.user: Return a promise from getRights/getGroups

Makes it easier to work with when trying to execute multiple
asychronous tasks in parralel with $.when, otherwise one would
have to wrap it in a custom Deferred again to be able to
aggregate it as a promise.

Change-Id: I69a132a2e6f2ddb236bc1a0dbd8f7ab311f7f873
---
M resources/mediawiki/mediawiki.user.js
M tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
2 files changed, 40 insertions(+), 27 deletions(-)

Approvals:
  Ori.livneh: Looks good to me, approved
  Bartosz Dziewoński: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/resources/mediawiki/mediawiki.user.js 
b/resources/mediawiki/mediawiki.user.js
index 3e375fb..78febd2 100644
--- a/resources/mediawiki/mediawiki.user.js
+++ b/resources/mediawiki/mediawiki.user.js
@@ -4,7 +4,7 @@
  */
 ( function ( mw, $ ) {
        var user,
-               callbacks = {},
+               deferreds = {},
                // Extend the skeleton mw.user from mediawiki.js
                // This is kind of ugly but we're stuck with this for b/c 
reasons
                options = mw.user.options || new mw.Map(),
@@ -15,31 +15,34 @@
         *
         * @private
         * @param {string} info One of 'groups' or 'rights'
-        * @param {Function} callback
+        * @param {Function} [callback]
+        * @return {jQuery.Promise}
         */
        function getUserInfo( info, callback ) {
                var api;
-               if ( callbacks[info] ) {
-                       callbacks[info].add( callback );
-                       return;
+               if ( !deferreds[info] ) {
+
+                       deferreds.rights = $.Deferred();
+                       deferreds.groups = $.Deferred();
+
+                       api = new mw.Api();
+                       api.get( {
+                               action: 'query',
+                               meta: 'userinfo',
+                               uiprop: 'rights|groups'
+                       } ).always( function ( data ) {
+                               var rights, groups;
+                               if ( data.query && data.query.userinfo ) {
+                                       rights = data.query.userinfo.rights;
+                                       groups = data.query.userinfo.groups;
+                               }
+                               deferreds.rights.resolve( rights || [] );
+                               deferreds.groups.resolve( groups || [] );
+                       } );
+
                }
-               callbacks.rights = $.Callbacks('once memory');
-               callbacks.groups = $.Callbacks('once memory');
-               callbacks[info].add( callback );
-               api = new mw.Api();
-               api.get( {
-                       action: 'query',
-                       meta: 'userinfo',
-                       uiprop: 'rights|groups'
-               } ).always( function ( data ) {
-                       var rights, groups;
-                       if ( data.query && data.query.userinfo ) {
-                               rights = data.query.userinfo.rights;
-                               groups = data.query.userinfo.groups;
-                       }
-                       callbacks.rights.fire( rights || [] );
-                       callbacks.groups.fire( groups || [] );
-               } );
+
+               return deferreds[info].done( callback ).promise();
        }
 
        mw.user = user = {
@@ -236,19 +239,21 @@
                /**
                 * Get the current user's groups
                 *
-                * @param {Function} callback
+                * @param {Function} [callback]
+                * @return {jQuery.Promise}
                 */
                getGroups: function ( callback ) {
-                       getUserInfo( 'groups', callback );
+                       return getUserInfo( 'groups', callback );
                },
 
                /**
                 * Get the current user's rights
                 *
-                * @param {Function} callback
+                * @param {Function} [callback]
+                * @return {jQuery.Promise}
                 */
                getRights: function ( callback ) {
-                       getUserInfo( 'rights', callback );
+                       return getUserInfo( 'rights', callback );
                }
        };
 
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js 
b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
index 96be3d1..f422bc1 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
@@ -48,10 +48,18 @@
                } );
        } );
 
-       QUnit.asyncTest( 'getRights', 1, function ( assert ) {
+       QUnit.test( 'getRights', 2, function ( assert ) {
+               QUnit.stop();
+               QUnit.stop();
+
                mw.user.getRights( function ( rights ) {
                        assert.equal( $.type( rights ), 'array', 'Callback gets 
an array' );
                        QUnit.start();
                } );
+
+               mw.user.getRights().done( function ( rights ) {
+                       assert.equal( $.type( rights ), 'array', 'Using promise 
interface instead of callback' );
+                       QUnit.start();
+               } );
        } );
 }( mediaWiki, jQuery ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/91617
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I69a132a2e6f2ddb236bc1a0dbd8f7ab311f7f873
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Krinkle <[email protected]>
Gerrit-Reviewer: Anomie <[email protected]>
Gerrit-Reviewer: Bartosz Dziewoński <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Daniel Friesen <[email protected]>
Gerrit-Reviewer: JGonera <[email protected]>
Gerrit-Reviewer: Jdlrobson <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Mattflaschen <[email protected]>
Gerrit-Reviewer: Nikerabbit <[email protected]>
Gerrit-Reviewer: Ori.livneh <[email protected]>
Gerrit-Reviewer: Spage <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to