mediawiki.api: Add xhr.abort method to promise object
authorAlex Monk <krenair@gmail.com>
Wed, 27 Mar 2013 21:52:00 +0000 (21:52 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 28 Mar 2013 05:01:32 +0000 (05:01 +0000)
jQuery.ajax does the same internally to extend the promise.

Change-Id: I3a8ae7a4c92dda5038cf7722ebd1d41dab0a7ef9

resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.watch.js

index 4de5291..8bba1fc 100644 (file)
                 * @return {boolean} return.done.isCategory Whether the category exists.
                 */
                isCategory: function ( title, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        prop: 'categoryinfo',
                                        titles: title.toString()
                                } )
@@ -36,7 +37,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
                /**
                 * @return {String[]} return.done.categories Matched categories
                 */
                getCategoriesByPrefix: function ( prefix, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
                        // Fetch with allpages to only get categories that have a corresponding description page.
-                       this.get( {
+                       apiPromise = this.get( {
                                        list: 'allpages',
                                        apprefix: prefix,
                                        apnamespace: mw.config.get('wgNamespaceIds').category
@@ -72,7 +74,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
 
                 *  if title was not found.
                 */
                getCategories: function ( title, ok, err, async ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        prop: 'categories',
                                        titles: title.toString()
                                }, {
                                                } );
                                        }
                                        d.resolve( ret );
-                               })
+                               } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                }
 
        } );
index 3c775ad..2cd1b92 100644 (file)
                 * @return {string} return.done.token Received token.
                 */
                getEditToken: function ( ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        action: 'tokens',
                                        type: 'edit'
                                }, {
@@ -87,7 +88,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
                /**
index cf7443f..142c454 100644 (file)
                 */
                ajax: function ( parameters, ajaxOptions ) {
                        var token,
-                               apiDeferred = $.Deferred();
+                               apiDeferred = $.Deferred(),
+                               xhr;
 
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                        ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
                        }
 
                        // Make the AJAX request
-                       $.ajax( ajaxOptions )
+                       xhr = $.ajax( ajaxOptions )
                                // If AJAX fails, reject API call with error code 'http'
                                // and details in second argument.
                                .fail( function ( xhr, textStatus, exception ) {
                                } );
 
                        // Return the Promise
-                       return apiDeferred.promise().fail( function ( code, details ) {
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
                                mw.log( 'mw.Api error: ', code, details );
-                       });
+                       } );
                }
 
        };
index ea0388c..4044655 100644 (file)
                 * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
                parse: function ( wikitext, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        action: 'parse',
                                        text: wikitext
                                } )
@@ -31,7 +32,7 @@
                                } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                }
        } );
 
index c86a90a..e2be5c7 100644 (file)
@@ -19,7 +19,9 @@
         * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
        function doWatchInternal( page, ok, err, addParams ) {
-               var params, d = $.Deferred();
+               var params,
+                       d = $.Deferred(),
+                       apiPromise;
                // Backwards compatibility (< MW 1.20)
                d.done( ok );
                d.fail( err );
                        $.extend( params, addParams );
                }
 
-               this.post( params )
+               apiPromise = this.post( params )
                        .done( function ( data ) {
                                d.resolve( data.watch );
                        } )
                        .fail( d.reject );
 
-               return d.promise();
+               return d.promise( { abort: apiPromise.abort } );
        }
 
        $.extend( mw.Api.prototype, {