mediawiki.api.login: Chain then() instead of Deferred wrapping
authorTimo Tijhof <krinklemail@gmail.com>
Wed, 11 Feb 2015 04:08:49 +0000 (04:08 +0000)
committerTimo Tijhof <krinklemail@gmail.com>
Wed, 11 Feb 2015 04:10:54 +0000 (04:10 +0000)
No need to wrap a promise and manually forwarding fail().
Using "then()" does this by default.

Remove redundant 'data.login' assertion. API errors are already
handled at this point.

Handle login error before success to allow a clean function exit.

Change-Id: I032226b1e2b362c61eb2c6de0c7f5ebe2ed25b7e

resources/src/mediawiki.api/mediawiki.api.login.js

index ccbae06..88c8caa 100644 (file)
@@ -14,8 +14,7 @@
                 * @return {jQuery.Promise} See mw.Api#post
                 */
                login: function ( username, password ) {
-                       var params, request,
-                               deferred = $.Deferred(),
+                       var params, apiPromise,
                                api = this;
 
                        params = {
                                lgpassword: password
                        };
 
-                       request = api.post( params );
-                       request.fail( deferred.reject );
-                       request.done( function ( data ) {
-                               params.lgtoken = data.login.token;
-                               api.post( params )
-                                       .fail( deferred.reject )
-                                       .done( function ( data ) {
-                                               var code;
-                                               if ( data.login && data.login.result === 'Success' ) {
-                                                       deferred.resolve( data );
-                                               } else {
-                                                       // Set proper error code whenever possible
-                                                       code = data.error && data.error.code || 'unknown';
-                                                       deferred.reject( code, data );
-                                               }
-                                       } );
-                       } );
-
-                       return deferred.promise( { abort: request.abort } );
+                       apiPromise = api.post( params );
+                       return apiPromise
+                               .then( function ( data ) {
+                                       params.lgtoken = data.login.token;
+                                       return api.post( params )
+                                               .then( function ( data ) {
+                                                       var code;
+                                                       if ( data.login.result !== 'Success' ) {
+                                                               // Set proper error code whenever possible
+                                                               code = data.error && data.error.code || 'unknown';
+                                                               return $.Deferred().reject( code, data );
+                                                       }
+                                                       return data;
+                                               } );
+                               } )
+                               .promise( { abort: apiPromise.abort } );
                }
        } );