diff --git a/src/classes/site.ts b/src/classes/site.ts index 9776bac47..bd24fe482 100644 --- a/src/classes/site.ts +++ b/src/classes/site.ts @@ -185,6 +185,7 @@ export class CoreSite { protected cleanUnicode = false; protected lastAutoLogin = 0; protected offlineDisabled = false; + protected ongoingRequests: { [cacheId: string]: Promise } = {}; /** * Create a site. @@ -571,7 +572,14 @@ export class CoreSite { return Promise.reject(this.utils.createFakeWSError('core.unicodenotsupportedcleanerror', true)); } - return this.getFromCache(method, data, preSets, false, originalData).catch(() => { + const cacheId = this.getCacheId(method, data); + + // Check for an ongoing identical request if we're not ignoring cache. + if (preSets.getFromCache && this.ongoingRequests[cacheId]) { + return this.ongoingRequests[cacheId]; + } + + const promise = this.getFromCache(method, data, preSets, false, originalData).catch(() => { // Do not pass those options to the core WS factory. return this.wsProvider.call(method, data, wsPreSets).then((response) => { if (preSets.saveToCache) { @@ -676,6 +684,17 @@ export class CoreSite { return response; }); + + this.ongoingRequests[cacheId] = promise; + // Clear ongoing request after setting the promise (just in case it's already resolved). + promise.finally(() => { + // Make sure we don't clear the promise of a newer request that ignores the cache. + if (this.ongoingRequests[cacheId] === promise) { + delete this.ongoingRequests[cacheId]; + } + }); + + return promise; } /** diff --git a/src/core/course/providers/log-helper.ts b/src/core/course/providers/log-helper.ts index 02a9aa92b..9ec8ea25b 100644 --- a/src/core/course/providers/log-helper.ts +++ b/src/core/course/providers/log-helper.ts @@ -28,7 +28,7 @@ export class CoreCourseLogHelperProvider { // Variables for database. static ACTIVITY_LOG_TABLE = 'course_activity_log'; protected siteSchema: CoreSiteSchema = { - name: 'CoreCourseOfflineProvider', + name: 'CoreCourseLogHelperProvider', version: 1, tables: [ { diff --git a/src/providers/ws.ts b/src/providers/ws.ts index de16e3103..bc2cd80fc 100644 --- a/src/providers/ws.ts +++ b/src/providers/ws.ts @@ -193,19 +193,14 @@ export class CoreWSProvider { data.wstoken = preSets.wsToken; siteUrl = preSets.siteUrl + '/webservice/rest/server.php?moodlewsrestformat=json'; - let promise = this.getPromiseHttp('post', preSets.siteUrl, data); + // There are some ongoing retry calls, wait for timeout. + if (this.retryCalls.length > 0) { + this.logger.warn('Calls locked, trying later...'); - if (!promise) { - // There are some ongoing retry calls, wait for timeout. - if (this.retryCalls.length > 0) { - this.logger.warn('Calls locked, trying later...'); - promise = this.addToRetryQueue(method, siteUrl, data, preSets); - } else { - promise = this.performPost(method, siteUrl, data, preSets); - } + return this.addToRetryQueue(method, siteUrl, data, preSets); + } else { + return this.performPost(method, siteUrl, data, preSets); } - - return promise; } /**