From 7db2904cd6a55c605d2ba25d40613c4faf6d77ac Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Mon, 23 Jan 2017 22:46:09 +0100 Subject: [PATCH] mediawiki.api.options: Use sequential API requests in the remaining edge cases Bug: T100908 Change-Id: I927c098fd750bd765ffd746d40c3f7408f99f2de --- resources/src/mediawiki/api/options.js | 44 +++++++++++++++----------- 1 file changed, 25 insertions(+), 19 deletions(-) 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; } } ); -- 2.20.1