From: Timo Tijhof Date: Thu, 24 Oct 2013 13:43:03 +0000 (+0200) Subject: mediawiki.user: Return a promise from getRights/getGroups X-Git-Tag: 1.31.0-rc.0~18296^2 X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/banques/%7B%7B%20url_for%28%27admin_users%27%29%20%7D%7D?a=commitdiff_plain;h=c2fd7fec5213c3c2d4e575d46d99dd557fe28794;p=lhc%2Fweb%2Fwiklou.git 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 --- diff --git a/resources/mediawiki/mediawiki.user.js b/resources/mediawiki/mediawiki.user.js index 3e375fb639..78febd2df6 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 96be3d1fb8..f422bc1e27 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 ) );