From: Bartosz Dziewoński Date: Mon, 23 Jan 2017 21:46:09 +0000 (+0100) Subject: mediawiki.api.options: Use sequential API requests in the remaining edge cases X-Git-Tag: 1.31.0-rc.0~4246^2 X-Git-Url: http://git.heureux-cyclage.org/?a=commitdiff_plain;h=7db2904cd6a55c605d2ba25d40613c4faf6d77ac;p=lhc%2Fweb%2Fwiklou.git mediawiki.api.options: Use sequential API requests in the remaining edge cases Bug: T100908 Change-Id: I927c098fd750bd765ffd746d40c3f7408f99f2de --- diff --git a/resources/src/mediawiki/api/options.js b/resources/src/mediawiki/api/options.js index 069fbbfcda..4930c4fccc 100644 --- a/resources/src/mediawiki/api/options.js +++ b/resources/src/mediawiki/api/options.js @@ -26,7 +26,7 @@ * Any warnings returned by the API, including warnings about invalid option names or values, * are ignored. However, do not rely on this behavior. * - * If necessary, the options will be saved using several parallel API requests. Only one promise + * If necessary, the options will be saved using several sequential API requests. Only one promise * is always returned that will be resolved when all requests complete. * * @param {Object} options Options as a `{ name: value, … }` object @@ -35,7 +35,7 @@ saveOptions: function ( options ) { var name, value, bundleable, grouped = [], - deferreds = []; + promise = $.Deferred().resolve(); for ( name in options ) { value = options[ name ] === null ? null : String( options[ name ] ); @@ -58,32 +58,38 @@ } } else { if ( value !== null ) { - deferreds.push( this.postWithToken( 'csrf', { - formatversion: 2, - action: 'options', - optionname: name, - optionvalue: value - } ) ); + promise = promise.then( function ( name, value ) { + return this.postWithToken( 'csrf', { + formatversion: 2, + action: 'options', + optionname: name, + optionvalue: value + } ); + }.bind( this, name, value ) ); } else { // Omitting value resets the option - deferreds.push( this.postWithToken( 'csrf', { - formatversion: 2, - action: 'options', - optionname: name - } ) ); + promise = promise.then( function ( name ) { + return this.postWithToken( 'csrf', { + formatversion: 2, + action: 'options', + optionname: name + } ); + }.bind( this, name ) ); } } } if ( grouped.length ) { - deferreds.push( this.postWithToken( 'csrf', { - formatversion: 2, - action: 'options', - change: grouped - } ) ); + promise = promise.then( function () { + return this.postWithToken( 'csrf', { + formatversion: 2, + action: 'options', + change: grouped + } ); + }.bind( this ) ); } - return $.when.apply( $, deferreds ); + return promise; } } );