From 3cc7de2f7a460333edcba9135e741da025896ce5 Mon Sep 17 00:00:00 2001 From: ikiw Date: Tue, 18 Feb 2020 18:38:13 +0530 Subject: [PATCH] 1.Resolve #7889 to fetch only 1 checkpoint call per notebook. 2.Refactor PR 7879 to use debouncer --- packages/docmanager-extension/src/index.ts | 14 +++--- packages/services/src/contents/index.ts | 52 +++++++++++++++------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/packages/docmanager-extension/src/index.ts b/packages/docmanager-extension/src/index.ts index a73280981442..5e9a02d59127 100644 --- a/packages/docmanager-extension/src/index.ts +++ b/packages/docmanager-extension/src/index.ts @@ -44,6 +44,8 @@ import { IDisposable } from '@lumino/disposable'; import { Widget } from '@lumino/widgets'; +import { Debouncer } from '@lumino/polling'; + /** * The command IDs used by the document manager plugin. */ @@ -244,15 +246,11 @@ ${fileTypes}`; // callback to registry change that ensures not to invoke reload method when there is already a promise that is pending let reloadSettingsRegistry = () => { - let promisePending = false; + let reloadDebounce = new Debouncer(() => + settingRegistry.reload(pluginId) + ); - return async () => { - if (!promisePending) { - promisePending = true; - await settingRegistry.reload(pluginId); - promisePending = false; - } - }; + return reloadDebounce.invoke.bind(reloadDebounce); }; // If the document registry gains or loses a factory or file type, diff --git a/packages/services/src/contents/index.ts b/packages/services/src/contents/index.ts index 0377aa57fa86..4611252dbbd9 100644 --- a/packages/services/src/contents/index.ts +++ b/packages/services/src/contents/index.ts @@ -27,6 +27,14 @@ const SERVICE_DRIVE_URL = 'api/contents'; */ const FILES_URL = 'files'; +/** + * The object to reference listCheckpoints promises + * used as a flag to check and return the existing promise if it's pending + */ +let checkpointPromiseQueue: { + [key: string]: Promise; +} = {}; + /** * A namespace for contents interfaces. */ @@ -1309,22 +1317,34 @@ export class Drive implements Contents.IDrive { */ listCheckpoints(localPath: string): Promise { let url = this._getUrl(localPath, 'checkpoints'); - return ServerConnection.makeRequest(url, {}, this.serverSettings) - .then(response => { - if (response.status !== 200) { - throw new ServerConnection.ResponseError(response); - } - return response.json(); - }) - .then(data => { - if (!Array.isArray(data)) { - throw new Error('Invalid Checkpoint list'); - } - for (let i = 0; i < data.length; i++) { - validate.validateCheckpointModel(data[i]); - } - return data; - }); + + if (!checkpointPromiseQueue[localPath]) { + checkpointPromiseQueue[localPath] = ServerConnection.makeRequest( + url, + {}, + this.serverSettings + ) + .then(response => { + if (response.status !== 200) { + throw new ServerConnection.ResponseError(response); + } + return response.json(); + }) + .then(data => { + if (!Array.isArray(data)) { + throw new Error('Invalid Checkpoint list'); + } + for (let i = 0; i < data.length; i++) { + validate.validateCheckpointModel(data[i]); + } + return data; + }) + .finally(() => { + delete checkpointPromiseQueue[localPath]; + }); + } + + return checkpointPromiseQueue[localPath]; } /**