mediawiki.api: Make the result promise of #postWithToken abortable
authorBartosz Dziewoński <matma.rex@gmail.com>
Tue, 26 Apr 2016 22:16:26 +0000 (00:16 +0200)
committerBartosz Dziewoński <matma.rex@gmail.com>
Mon, 2 May 2016 15:37:12 +0000 (15:37 +0000)
Calling .abort() will abort whichever request is ongoing at the moment.

Change-Id: I76acf0f7f270c5d2bd651595a8b9407d37fbb095

resources/src/mediawiki/api.js

index 1f21fc6..f82c260 100644 (file)
                 * @since 1.22
                 */
                postWithToken: function ( tokenType, params, ajaxOptions ) {
-                       var api = this;
+                       var api = this,
+                               abortable;
 
-                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                       return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
                                params.token = token;
-                               return api.post( params, ajaxOptions ).then(
+                               return ( abortable = api.post( params, ajaxOptions ) ).then(
                                        // If no error, return to caller as-is
                                        null,
                                        // Error handler
                                                        api.badToken( tokenType );
                                                        // Try again, once
                                                        params.token = undefined;
-                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                                                       return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
                                                                params.token = token;
-                                                               return api.post( params, ajaxOptions );
+                                                               return ( abortable = api.post( params, ajaxOptions ) ).promise();
                                                        } );
                                                }
 
                                                return this;
                                        }
                                );
-                       } );
+                       } ).promise( { abort: function () {
+                               abortable.abort();
+                       } } );
                },
 
                /**