From: Prateek Saxena Date: Wed, 14 Sep 2016 12:15:11 +0000 (+0530) Subject: mw.widgets.CategorySelector: Add client-side caching X-Git-Tag: 1.31.0-rc.0~5512^2 X-Git-Url: http://git.cyclocoop.org/%27.%28%24current%20%3E%202?a=commitdiff_plain;h=de8409a758a0ee7aed460d7d7f4534ef4dc31473;p=lhc%2Fweb%2Fwiklou.git mw.widgets.CategorySelector: Add client-side caching The key in the cache hash is the string to be searched and the number of the searchTypes appended as a string. This feels a bit hacky but it'll do the job and doesn't seem wrong. Change-Id: Idfc931e825aaa30e00b57445d6c4afd67857609e --- diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js index 7fdef257d3..267eebbfc3 100644 --- a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js +++ b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js @@ -65,6 +65,7 @@ // Initialize this.api = config.api || new mw.Api(); + this.searchCache = {}; } /* Setup */ @@ -269,7 +270,13 @@ * @return {jQuery.Promise} Resolves with an array of categories */ CSP.searchCategories = function ( input, searchType ) { - var deferred = $.Deferred(); + var deferred = $.Deferred(), + cacheKey = input + searchType.toString(); + + // Check cache + if ( this.searchCache[ cacheKey ] !== undefined ) { + return this.searchCache[ cacheKey ]; + } switch ( searchType ) { case CategorySelector.SearchType.OpenSearch: @@ -363,12 +370,10 @@ var categories = []; $.each( res.query.pages, function ( index, page ) { - if ( !page.missing ) { - if ( $.isArray( page.categories ) ) { - categories.push.apply( categories, page.categories.map( function ( category ) { - return category.title; - } ) ); - } + if ( !page.missing && $.isArray( page.categories ) ) { + categories.push.apply( categories, page.categories.map( function ( category ) { + return category.title; + } ) ); } } ); @@ -380,6 +385,9 @@ throw new Error( 'Unknown searchType' ); } + // Cache the result + this.searchCache[ cacheKey ] = deferred.promise(); + return deferred.promise(); };